Warning: Permanently added '34.230.38.142' (ECDSA) to the list of known hosts. Running: /usr/bin/copr-rpmbuild --verbose --drop-resultdir --build-id 1810570 --chroot fedora-rawhide-x86_64 --detached Version: 0.44 Task: {'bootstrap': 'off', 'build_id': 1810570, 'buildroot_pkgs': [], 'chroot': 'fedora-rawhide-x86_64', 'enable_net': False, 'git_hash': '5cb083bb77959208f5d4a0c03caeb8e10575c8d8', 'git_repo': 'https://copr-dist-git.fedorainfracloud.org/git/blowry/pcem/pcem.git', 'isolation': 'default', 'memory_reqs': 2048, 'package_name': 'pcem', 'package_version': '17-1.fc33', 'project_dirname': 'pcem', 'project_name': 'pcem', 'project_owner': 'blowry', 'repos': [{'baseurl': 'https://download.copr.fedorainfracloud.org/results/blowry/pcem/fedora-rawhide-x86_64/', 'id': 'copr_base', 'name': 'Copr repository'}], 'sandbox': 'blowry/pcem--blowry', 'source_json': {}, 'source_type': None, 'submitter': 'blowry', 'task_id': '1810570-fedora-rawhide-x86_64', 'timeout': 18000, 'uses_devel_repo': False, 'with_opts': [], 'without_opts': []} Running: git clone https://copr-dist-git.fedorainfracloud.org/git/blowry/pcem/pcem.git /tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem --depth 500 --no-single-branch cmd: ['git', 'clone', 'https://copr-dist-git.fedorainfracloud.org/git/blowry/pcem/pcem.git', '/tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem', '--depth', '500', '--no-single-branch'] cwd: . rc: 0 stdout: stderr: Cloning into '/tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem'... Running: git checkout 5cb083bb77959208f5d4a0c03caeb8e10575c8d8 cmd: ['git', 'checkout', '5cb083bb77959208f5d4a0c03caeb8e10575c8d8'] cwd: /tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem rc: 0 stdout: stderr: Note: switching to '5cb083bb77959208f5d4a0c03caeb8e10575c8d8'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by switching back to a branch. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -c with the switch command. Example: git switch -c Or undo this operation with: git switch - Turn off this advice by setting config variable advice.detachedHead to false HEAD is now at 5cb083b automatic import of pcem Running: copr-distgit-client sources cmd: ['copr-distgit-client', 'sources'] cwd: /tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem rc: 0 stdout: stderr: INFO: Reading stdout from command: git rev-parse --abbrev-ref HEAD INFO: Reading stdout from command: git rev-parse HEAD INFO: Reading sources specification file: sources INFO: Downloading PCemV17Linux.tar.gz INFO: Calling: curl -H Pragma: -o PCemV17Linux.tar.gz --location --remote-time --show-error --fail https://copr-dist-git.fedorainfracloud.org/repo/pkgs/blowry/pcem/pcem/PCemV17Linux.tar.gz/md5/6348bc47fcc7346e3d2b2ec79e0d7be5/PCemV17Linux.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current /usr/bin/tail: /var/lib/copr-rpmbuild/main.log: file truncated Dload Upload Total Spent Left Speed 100 1836k 100 1836k 0 0 43.7M 0 --:--:-- --:--:-- --:--:-- 43.7M INFO: Reading stdout from command: md5sum PCemV17Linux.tar.gz Running (timeout=18000): unbuffer mock --buildsrpm --spec /tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem/pcem.spec --sources /tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1607008665.209942 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 2.6 starting (python version = 3.9.0)... Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem/pcem.spec) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1607008665.209942/root. INFO: calling preinit hooks INFO: enabled root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin Mock Version: 2.6 INFO: Mock Version: 2.6 Start: dnf install No matches found for the following disable plugin patterns: local, spacewalk Copr repository 21 kB/s | 5.1 kB 00:00 fedora 26 MB/s | 73 MB 00:02 Dependencies resolved. ======================================================================================= Package Arch Version Repo Size ======================================================================================= Installing group/module packages: bash  x86_64 5.0.17-2.fc33 fedora 1.7 M bzip2  x86_64 1.0.8-4.fc33 fedora 52 k coreutils  x86_64 8.32-14.fc34 fedora 1.1 M cpio  x86_64 2.13-8.fc33 fedora 273 k diffutils  x86_64 3.7-7.fc34 fedora 390 k fedora-release-common  noarch 34-0.9 fedora 21 k findutils  x86_64 1:4.7.0-7.fc33 fedora 539 k gawk  x86_64 5.1.0-2.fc33 fedora 1.0 M glibc-minimal-langpack  x86_64 2.32.9000-17.fc34 fedora 96 k grep  x86_64 3.6-1.fc34 fedora 260 k gzip  x86_64 1.10-3.fc33 fedora 152 k info  x86_64 6.7-8.fc33 fedora 228 k make  x86_64 1:4.3-2.fc33 fedora 539 k patch  x86_64 2.7.6-13.fc33 fedora 129 k redhat-rpm-config  noarch 177-1.fc34 fedora 65 k rpm-build  x86_64 4.16.0-5.fc34 fedora 96 k sed  x86_64 4.8-6.fc34 fedora 298 k shadow-utils  x86_64 2:4.8.1-6.fc34 fedora 1.2 M tar  x86_64 2:1.32-6.fc33 fedora 880 k unzip  x86_64 6.0-49.fc33 fedora 181 k util-linux  x86_64 2.36.1-2.fc34 fedora 2.5 M which  x86_64 2.21-20.fc33 fedora 41 k xz  x86_64 5.2.5-3.fc33 fedora 216 k Installing dependencies: alternatives  x86_64 1.14-3.fc33 fedora 36 k audit-libs  x86_64 3.0-0.21.20191104git1c2f876.fc33 fedora 113 k basesystem  noarch 11-10.fc33 fedora 6.8 k binutils  x86_64 2.35.1-16.fc34 fedora 5.3 M binutils-gold  x86_64 2.35.1-16.fc34 fedora 750 k bzip2-libs  x86_64 1.0.8-4.fc33 fedora 40 k ca-certificates  noarch 2020.2.41-4.fc33 fedora 352 k coreutils-common  x86_64 8.32-14.fc34 fedora 2.0 M cracklib  x86_64 2.9.6-24.fc33 fedora 83 k crypto-policies  noarch 20200918-1.git85dccc5.fc34 fedora 57 k curl  x86_64 7.73.0-2.fc34 fedora 298 k cyrus-sasl-lib  x86_64 2.1.27-6.fc33 fedora 101 k dwz  x86_64 0.13-4.fc33 fedora 106 k ed  x86_64 1.14.2-9.fc33 fedora 75 k efi-srpm-macros  noarch 4-5.fc33 fedora 21 k elfutils  x86_64 0.182-1.fc34 fedora 529 k elfutils-debuginfod-client  x86_64 0.182-1.fc34 fedora 33 k elfutils-default-yama-scope  noarch 0.182-1.fc34 fedora 17 k elfutils-libelf  x86_64 0.182-1.fc34 fedora 194 k elfutils-libs  x86_64 0.182-1.fc34 fedora 265 k expat  x86_64 2.2.10-1.fc34 fedora 104 k fedora-gpg-keys  noarch 34-0.8 fedora 107 k fedora-release  noarch 34-0.9 fedora 12 k fedora-release-identity-basic  noarch 34-0.9 fedora 13 k fedora-repos  noarch 34-0.8 fedora 11 k fedora-repos-rawhide  noarch 34-0.8 fedora 10 k file  x86_64 5.39-3.fc34 fedora 51 k file-libs  x86_64 5.39-3.fc34 fedora 591 k filesystem  x86_64 3.14-4.fc34 fedora 1.1 M fonts-srpm-macros  noarch 1:2.0.5-4.fc33 fedora 27 k fpc-srpm-macros  noarch 1.3-2.fc33 fedora 7.6 k gc  x86_64 8.0.4-4.fc33 fedora 104 k gdb-minimal  x86_64 10.1-1.fc34 fedora 3.6 M ghc-srpm-macros  noarch 1.5.0-3.fc33 fedora 7.7 k glibc  x86_64 2.32.9000-17.fc34 fedora 3.5 M glibc-common  x86_64 2.32.9000-17.fc34 fedora 1.8 M gmp  x86_64 1:6.2.0-5.fc34 fedora 320 k gnat-srpm-macros  noarch 4-12.fc33 fedora 8.2 k go-srpm-macros  noarch 3.0.9-1.fc34 fedora 25 k guile22  x86_64 2.2.7-1.fc34 fedora 6.5 M kernel-srpm-macros  noarch 1.0-3.fc33 fedora 7.2 k keyutils-libs  x86_64 1.6-5.fc33 fedora 31 k krb5-libs  x86_64 1.18.3-4.fc34 fedora 734 k libacl  x86_64 2.2.53-9.fc34 fedora 23 k libarchive  x86_64 3.4.3-3.fc33 fedora 390 k libattr  x86_64 2.4.48-10.fc33 fedora 18 k libblkid  x86_64 2.36.1-2.fc34 fedora 99 k libbrotli  x86_64 1.0.9-3.fc34 fedora 322 k libcap  x86_64 2.44-1.fc34 fedora 60 k libcap-ng  x86_64 0.8.1-2.fc34 fedora 32 k libcom_err  x86_64 1.45.6-4.fc33 fedora 27 k libcurl  x86_64 7.73.0-2.fc34 fedora 282 k libdb  x86_64 5.3.28-44.fc33 fedora 759 k libeconf  x86_64 0.3.8-4.fc33 fedora 24 k libfdisk  x86_64 2.36.1-2.fc34 fedora 151 k libffi  x86_64 3.1-26.fc33 fedora 33 k libgcc  x86_64 10.2.1-9.fc34 fedora 100 k libgcrypt  x86_64 1.8.7-1.fc34 fedora 476 k libgomp  x86_64 10.2.1-9.fc34 fedora 261 k libgpg-error  x86_64 1.39-1.fc34 fedora 210 k libidn2  x86_64 2.3.0-4.fc33 fedora 104 k libmetalink  x86_64 0.1.3-13.fc33 fedora 31 k libmount  x86_64 2.36.1-2.fc34 fedora 129 k libnghttp2  x86_64 1.42.0-1.fc34 fedora 76 k libnsl2  x86_64 1.3.0-1.fc34 fedora 58 k libpkgconf  x86_64 1.7.3-5.fc34 fedora 36 k libpsl  x86_64 0.21.1-2.fc33 fedora 61 k libpwquality  x86_64 1.4.4-1.fc34 fedora 104 k libselinux  x86_64 3.1-5.fc34 fedora 84 k libsemanage  x86_64 3.1-5.fc34 fedora 115 k libsepol  x86_64 3.1-5.fc34 fedora 283 k libsigsegv  x86_64 2.11-11.fc33 fedora 26 k libsmartcols  x86_64 2.36.1-2.fc34 fedora 59 k libssh  x86_64 0.9.5-1.fc34 fedora 209 k libssh-config  noarch 0.9.5-1.fc34 fedora 11 k libstdc++  x86_64 10.2.1-9.fc34 fedora 620 k libtasn1  x86_64 4.16.0-3.fc33 fedora 75 k libtirpc  x86_64 1.2.6-2.rc4.fc33 fedora 95 k libtool-ltdl  x86_64 2.4.6-36.fc33 fedora 36 k libunistring  x86_64 0.9.10-9.fc33 fedora 516 k libutempter  x86_64 1.2.1-3.fc34 fedora 26 k libuuid  x86_64 2.36.1-2.fc34 fedora 25 k libverto  x86_64 0.3.0-11.fc34 fedora 21 k libxcrypt  x86_64 4.4.17-1.fc34 fedora 121 k libxml2  x86_64 2.9.10-9.fc34 fedora 744 k libzstd  x86_64 1.4.5-6.fc34 fedora 297 k lua-libs  x86_64 5.4.1-1.fc34 fedora 215 k lua-srpm-macros  noarch 1-2.fc34 fedora 7.9 k lz4-libs  x86_64 1.9.1-3.fc33 fedora 59 k mpfr  x86_64 4.1.0-2.fc33 fedora 1.4 M ncurses-base  noarch 6.2-3.20200222.fc33 fedora 60 k ncurses-libs  x86_64 6.2-3.20200222.fc33 fedora 329 k nim-srpm-macros  noarch 3-3.fc33 fedora 8.3 k ocaml-srpm-macros  noarch 6-3.fc33 fedora 7.7 k openblas-srpm-macros  noarch 2-8.fc33 fedora 7.2 k openldap  x86_64 2.4.56-1.fc34 fedora 310 k openssl-libs  x86_64 1:1.1.1h-1.fc34 fedora 1.4 M p11-kit  x86_64 0.23.21-2.fc34 fedora 368 k p11-kit-trust  x86_64 0.23.21-2.fc34 fedora 138 k pam  x86_64 1.5.1-2.fc34 fedora 545 k pcre  x86_64 8.44-2.fc34 fedora 198 k pcre2  x86_64 10.36-0.1.RC1.fc34 fedora 233 k pcre2-syntax  noarch 10.36-0.1.RC1.fc34 fedora 143 k perl-srpm-macros  noarch 1-38.fc33 fedora 8.3 k pkgconf  x86_64 1.7.3-5.fc34 fedora 41 k pkgconf-m4  noarch 1.7.3-5.fc34 fedora 14 k pkgconf-pkg-config  x86_64 1.7.3-5.fc34 fedora 10 k popt  x86_64 1.18-2.fc33 fedora 58 k publicsuffix-list-dafsa  noarch 20190417-4.fc33 fedora 55 k python-srpm-macros  noarch 3.9-10.fc34 fedora 21 k qt5-srpm-macros  noarch 5.15.2-1.fc34 fedora 8.4 k readline  x86_64 8.0-5.fc33 fedora 206 k rpm  x86_64 4.16.0-5.fc34 fedora 501 k rpm-build-libs  x86_64 4.16.0-5.fc34 fedora 96 k rpm-libs  x86_64 4.16.0-5.fc34 fedora 326 k rust-srpm-macros  noarch 16-1.fc34 fedora 9.8 k setup  noarch 2.13.7-2.fc33 fedora 142 k sqlite-libs  x86_64 3.33.0-2.fc34 fedora 621 k systemd-libs  x86_64 247.1-1.fc34 fedora 544 k tzdata  noarch 2020d-1.fc34 fedora 430 k xxhash-libs  x86_64 0.8.0-1.fc33 fedora 41 k xz-libs  x86_64 5.2.5-3.fc33 fedora 92 k zip  x86_64 3.0-27.fc33 fedora 258 k zlib  x86_64 1.2.11-23.fc34 fedora 92 k zstd  x86_64 1.4.5-6.fc34 fedora 539 k Installing Groups: Buildsystem building group Transaction Summary ======================================================================================= Install 148 Packages Total download size: 57 M Installed size: 224 M Downloading Packages: (1/148): basesystem-11-10.fc33.noarch.rpm 286 kB/s | 6.8 kB 00:00 (2/148): alternatives-1.14-3.fc33.x86_64.rpm 1.3 MB/s | 36 kB 00:00 (3/148): bash-5.0.17-2.fc33.x86_64.rpm 103 MB/s | 1.7 MB 00:00 (4/148): audit-libs-3.0-0.21.20191104git1c2f876 2.4 MB/s | 113 kB 00:00 (5/148): binutils-2.35.1-16.fc34.x86_64.rpm 99 MB/s | 5.3 MB 00:00 (6/148): binutils-gold-2.35.1-16.fc34.x86_64.rp 19 MB/s | 750 kB 00:00 (7/148): bzip2-1.0.8-4.fc33.x86_64.rpm 1.5 MB/s | 52 kB 00:00 (8/148): bzip2-libs-1.0.8-4.fc33.x86_64.rpm 13 MB/s | 40 kB 00:00 (9/148): ca-certificates-2020.2.41-4.fc33.noarc 35 MB/s | 352 kB 00:00 (10/148): coreutils-8.32-14.fc34.x86_64.rpm 73 MB/s | 1.1 MB 00:00 (11/148): coreutils-common-8.32-14.fc34.x86_64. 91 MB/s | 2.0 MB 00:00 (12/148): cracklib-2.9.6-24.fc33.x86_64.rpm 7.4 MB/s | 83 kB 00:00 (13/148): cpio-2.13-8.fc33.x86_64.rpm 20 MB/s | 273 kB 00:00 (14/148): crypto-policies-20200918-1.git85dccc5 20 MB/s | 57 kB 00:00 (15/148): curl-7.73.0-2.fc34.x86_64.rpm 51 MB/s | 298 kB 00:00 (16/148): cyrus-sasl-lib-2.1.27-6.fc33.x86_64.r 16 MB/s | 101 kB 00:00 (17/148): diffutils-3.7-7.fc34.x86_64.rpm 62 MB/s | 390 kB 00:00 (18/148): dwz-0.13-4.fc33.x86_64.rpm 24 MB/s | 106 kB 00:00 (19/148): ed-1.14.2-9.fc33.x86_64.rpm 31 MB/s | 75 kB 00:00 (20/148): efi-srpm-macros-4-5.fc33.noarch.rpm 6.5 MB/s | 21 kB 00:00 (21/148): elfutils-debuginfod-client-0.182-1.fc 12 MB/s | 33 kB 00:00 (22/148): elfutils-default-yama-scope-0.182-1.f 8.2 MB/s | 17 kB 00:00 (23/148): elfutils-libelf-0.182-1.fc34.x86_64.r 57 MB/s | 194 kB 00:00 (24/148): elfutils-libs-0.182-1.fc34.x86_64.rpm 63 MB/s | 265 kB 00:00 (25/148): expat-2.2.10-1.fc34.x86_64.rpm 25 MB/s | 104 kB 00:00 (26/148): fedora-gpg-keys-34-0.8.noarch.rpm 30 MB/s | 107 kB 00:00 (27/148): fedora-release-34-0.9.noarch.rpm 4.0 MB/s | 12 kB 00:00 (28/148): elfutils-0.182-1.fc34.x86_64.rpm 27 MB/s | 529 kB 00:00 (29/148): fedora-release-common-34-0.9.noarch.r 4.6 MB/s | 21 kB 00:00 (30/148): fedora-release-identity-basic-34-0.9. 3.2 MB/s | 13 kB 00:00 (31/148): fedora-repos-34-0.8.noarch.rpm 5.6 MB/s | 11 kB 00:00 (32/148): fedora-repos-rawhide-34-0.8.noarch.rp 5.6 MB/s | 10 kB 00:00 (33/148): file-5.39-3.fc34.x86_64.rpm 15 MB/s | 51 kB 00:00 (34/148): filesystem-3.14-4.fc34.x86_64.rpm 83 MB/s | 1.1 MB 00:00 (35/148): fonts-srpm-macros-2.0.5-4.fc33.noarch 4.3 MB/s | 27 kB 00:00 (36/148): file-libs-5.39-3.fc34.x86_64.rpm 23 MB/s | 591 kB 00:00 (37/148): findutils-4.7.0-7.fc33.x86_64.rpm 22 MB/s | 539 kB 00:00 (38/148): fpc-srpm-macros-1.3-2.fc33.noarch.rpm 1.1 MB/s | 7.6 kB 00:00 (39/148): gawk-5.1.0-2.fc33.x86_64.rpm 71 MB/s | 1.0 MB 00:00 (40/148): gc-8.0.4-4.fc33.x86_64.rpm 7.1 MB/s | 104 kB 00:00 (41/148): gdb-minimal-10.1-1.fc34.x86_64.rpm 85 MB/s | 3.6 MB 00:00 (42/148): ghc-srpm-macros-1.5.0-3.fc33.noarch.r 328 kB/s | 7.7 kB 00:00 (43/148): glibc-minimal-langpack-2.32.9000-17.f 30 MB/s | 96 kB 00:00 (44/148): glibc-common-2.32.9000-17.fc34.x86_64 100 MB/s | 1.8 MB 00:00 (45/148): gmp-6.2.0-5.fc34.x86_64.rpm 24 MB/s | 320 kB 00:00 (46/148): gnat-srpm-macros-4-12.fc33.noarch.rpm 2.3 MB/s | 8.2 kB 00:00 (47/148): go-srpm-macros-3.0.9-1.fc34.noarch.rp 4.0 MB/s | 25 kB 00:00 (48/148): grep-3.6-1.fc34.x86_64.rpm 33 MB/s | 260 kB 00:00 (49/148): guile22-2.2.7-1.fc34.x86_64.rpm 129 MB/s | 6.5 MB 00:00 (50/148): gzip-1.10-3.fc33.x86_64.rpm 3.4 MB/s | 152 kB 00:00 (51/148): info-6.7-8.fc33.x86_64.rpm 34 MB/s | 228 kB 00:00 (52/148): kernel-srpm-macros-1.0-3.fc33.noarch. 1.4 MB/s | 7.2 kB 00:00 (53/148): keyutils-libs-1.6-5.fc33.x86_64.rpm 15 MB/s | 31 kB 00:00 (54/148): krb5-libs-1.18.3-4.fc34.x86_64.rpm 86 MB/s | 734 kB 00:00 (55/148): libacl-2.2.53-9.fc34.x86_64.rpm 2.6 MB/s | 23 kB 00:00 (56/148): libarchive-3.4.3-3.fc33.x86_64.rpm 46 MB/s | 390 kB 00:00 (57/148): libattr-2.4.48-10.fc33.x86_64.rpm 2.4 MB/s | 18 kB 00:00 (58/148): libblkid-2.36.1-2.fc34.x86_64.rpm 7.1 MB/s | 99 kB 00:00 (59/148): libbrotli-1.0.9-3.fc34.x86_64.rpm 18 MB/s | 322 kB 00:00 (60/148): libcap-2.44-1.fc34.x86_64.rpm 14 MB/s | 60 kB 00:00 (61/148): libcap-ng-0.8.1-2.fc34.x86_64.rpm 11 MB/s | 32 kB 00:00 (62/148): libcom_err-1.45.6-4.fc33.x86_64.rpm 8.8 MB/s | 27 kB 00:00 (63/148): libcurl-7.73.0-2.fc34.x86_64.rpm 39 MB/s | 282 kB 00:00 (64/148): libdb-5.3.28-44.fc33.x86_64.rpm 55 MB/s | 759 kB 00:00 (65/148): libeconf-0.3.8-4.fc33.x86_64.rpm 3.0 MB/s | 24 kB 00:00 (66/148): libffi-3.1-26.fc33.x86_64.rpm 13 MB/s | 33 kB 00:00 (67/148): libfdisk-2.36.1-2.fc34.x86_64.rpm 24 MB/s | 151 kB 00:00 (68/148): libgcc-10.2.1-9.fc34.x86_64.rpm 26 MB/s | 100 kB 00:00 (69/148): libgomp-10.2.1-9.fc34.x86_64.rpm 48 MB/s | 261 kB 00:00 (70/148): glibc-2.32.9000-17.fc34.x86_64.rpm 17 MB/s | 3.5 MB 00:00 (71/148): libgpg-error-1.39-1.fc34.x86_64.rpm 11 MB/s | 210 kB 00:00 (72/148): libgcrypt-1.8.7-1.fc34.x86_64.rpm 16 MB/s | 476 kB 00:00 (73/148): libidn2-2.3.0-4.fc33.x86_64.rpm 18 MB/s | 104 kB 00:00 (74/148): libmetalink-0.1.3-13.fc33.x86_64.rpm 7.2 MB/s | 31 kB 00:00 (75/148): libnghttp2-1.42.0-1.fc34.x86_64.rpm 23 MB/s | 76 kB 00:00 (76/148): libnsl2-1.3.0-1.fc34.x86_64.rpm 13 MB/s | 58 kB 00:00 (77/148): libmount-2.36.1-2.fc34.x86_64.rpm 18 MB/s | 129 kB 00:00 (78/148): libpkgconf-1.7.3-5.fc34.x86_64.rpm 12 MB/s | 36 kB 00:00 (79/148): libpsl-0.21.1-2.fc33.x86_64.rpm 14 MB/s | 61 kB 00:00 (80/148): libpwquality-1.4.4-1.fc34.x86_64.rpm 27 MB/s | 104 kB 00:00 (81/148): libselinux-3.1-5.fc34.x86_64.rpm 17 MB/s | 84 kB 00:00 (82/148): libsepol-3.1-5.fc34.x86_64.rpm 56 MB/s | 283 kB 00:00 (83/148): libsemanage-3.1-5.fc34.x86_64.rpm 17 MB/s | 115 kB 00:00 (84/148): libsigsegv-2.11-11.fc33.x86_64.rpm 4.7 MB/s | 26 kB 00:00 (85/148): libsmartcols-2.36.1-2.fc34.x86_64.rpm 20 MB/s | 59 kB 00:00 (86/148): libssh-0.9.5-1.fc34.x86_64.rpm 58 MB/s | 209 kB 00:00 (87/148): libssh-config-0.9.5-1.fc34.noarch.rpm 3.0 MB/s | 11 kB 00:00 (88/148): libstdc++-10.2.1-9.fc34.x86_64.rpm 69 MB/s | 620 kB 00:00 (89/148): libtasn1-4.16.0-3.fc33.x86_64.rpm 16 MB/s | 75 kB 00:00 (90/148): libtirpc-1.2.6-2.rc4.fc33.x86_64.rpm 17 MB/s | 95 kB 00:00 (91/148): libtool-ltdl-2.4.6-36.fc33.x86_64.rpm 13 MB/s | 36 kB 00:00 (92/148): libunistring-0.9.10-9.fc33.x86_64.rpm 88 MB/s | 516 kB 00:00 (93/148): libutempter-1.2.1-3.fc34.x86_64.rpm 3.7 MB/s | 26 kB 00:00 (94/148): libuuid-2.36.1-2.fc34.x86_64.rpm 3.8 MB/s | 25 kB 00:00 (95/148): libverto-0.3.0-11.fc34.x86_64.rpm 8.6 MB/s | 21 kB 00:00 (96/148): libxcrypt-4.4.17-1.fc34.x86_64.rpm 47 MB/s | 121 kB 00:00 (97/148): libxml2-2.9.10-9.fc34.x86_64.rpm 73 MB/s | 744 kB 00:00 (98/148): libzstd-1.4.5-6.fc34.x86_64.rpm 27 MB/s | 297 kB 00:00 (99/148): lua-libs-5.4.1-1.fc34.x86_64.rpm 29 MB/s | 215 kB 00:00 (100/148): lua-srpm-macros-1-2.fc34.noarch.rpm 3.1 MB/s | 7.9 kB 00:00 (101/148): lz4-libs-1.9.1-3.fc33.x86_64.rpm 15 MB/s | 59 kB 00:00 (102/148): make-4.3-2.fc33.x86_64.rpm 71 MB/s | 539 kB 00:00 (103/148): ncurses-base-6.2-3.20200222.fc33.noa 9.7 MB/s | 60 kB 00:00 (104/148): mpfr-4.1.0-2.fc33.x86_64.rpm 74 MB/s | 1.4 MB 00:00 (105/148): ncurses-libs-6.2-3.20200222.fc33.x86 25 MB/s | 329 kB 00:00 (106/148): nim-srpm-macros-3-3.fc33.noarch.rpm 884 kB/s | 8.3 kB 00:00 (107/148): ocaml-srpm-macros-6-3.fc33.noarch.rp 2.3 MB/s | 7.7 kB 00:00 (108/148): openblas-srpm-macros-2-8.fc33.noarch 3.3 MB/s | 7.2 kB 00:00 (109/148): openldap-2.4.56-1.fc34.x86_64.rpm 51 MB/s | 310 kB 00:00 (110/148): p11-kit-0.23.21-2.fc34.x86_64.rpm 48 MB/s | 368 kB 00:00 (111/148): p11-kit-trust-0.23.21-2.fc34.x86_64. 30 MB/s | 138 kB 00:00 (112/148): patch-2.7.6-13.fc33.x86_64.rpm 18 MB/s | 129 kB 00:00 (113/148): pcre-8.44-2.fc34.x86_64.rpm 46 MB/s | 198 kB 00:00 (114/148): pcre2-10.36-0.1.RC1.fc34.x86_64.rpm 40 MB/s | 233 kB 00:00 (115/148): pcre2-syntax-10.36-0.1.RC1.fc34.noar 16 MB/s | 143 kB 00:00 (116/148): pam-1.5.1-2.fc34.x86_64.rpm 15 MB/s | 545 kB 00:00 (117/148): perl-srpm-macros-1-38.fc33.noarch.rp 1.3 MB/s | 8.3 kB 00:00 (118/148): openssl-libs-1.1.1h-1.fc34.x86_64.rp 26 MB/s | 1.4 MB 00:00 (119/148): pkgconf-1.7.3-5.fc34.x86_64.rpm 4.7 MB/s | 41 kB 00:00 (120/148): pkgconf-m4-1.7.3-5.fc34.noarch.rpm 1.8 MB/s | 14 kB 00:00 (121/148): pkgconf-pkg-config-1.7.3-5.fc34.x86_ 4.0 MB/s | 10 kB 00:00 (122/148): popt-1.18-2.fc33.x86_64.rpm 22 MB/s | 58 kB 00:00 (123/148): publicsuffix-list-dafsa-20190417-4.f 14 MB/s | 55 kB 00:00 (124/148): python-srpm-macros-3.9-10.fc34.noarc 6.3 MB/s | 21 kB 00:00 (125/148): qt5-srpm-macros-5.15.2-1.fc34.noarch 3.5 MB/s | 8.4 kB 00:00 (126/148): readline-8.0-5.fc33.x86_64.rpm 45 MB/s | 206 kB 00:00 (127/148): redhat-rpm-config-177-1.fc34.noarch. 9.3 MB/s | 65 kB 00:00 (128/148): rpm-build-4.16.0-5.fc34.x86_64.rpm 20 MB/s | 96 kB 00:00 (129/148): rpm-build-libs-4.16.0-5.fc34.x86_64. 21 MB/s | 96 kB 00:00 (130/148): rpm-libs-4.16.0-5.fc34.x86_64.rpm 73 MB/s | 326 kB 00:00 (131/148): rust-srpm-macros-16-1.fc34.noarch.rp 1.8 MB/s | 9.8 kB 00:00 (132/148): rpm-4.16.0-5.fc34.x86_64.rpm 23 MB/s | 501 kB 00:00 (133/148): sed-4.8-6.fc34.x86_64.rpm 43 MB/s | 298 kB 00:00 (134/148): setup-2.13.7-2.fc33.noarch.rpm 18 MB/s | 142 kB 00:00 (135/148): shadow-utils-4.8.1-6.fc34.x86_64.rpm 92 MB/s | 1.2 MB 00:00 (136/148): systemd-libs-247.1-1.fc34.x86_64.rpm 49 MB/s | 544 kB 00:00 (137/148): sqlite-libs-3.33.0-2.fc34.x86_64.rpm 33 MB/s | 621 kB 00:00 (138/148): tar-1.32-6.fc33.x86_64.rpm 60 MB/s | 880 kB 00:00 (139/148): tzdata-2020d-1.fc34.noarch.rpm 38 MB/s | 430 kB 00:00 (140/148): unzip-6.0-49.fc33.x86_64.rpm 16 MB/s | 181 kB 00:00 (141/148): util-linux-2.36.1-2.fc34.x86_64.rpm 107 MB/s | 2.5 MB 00:00 (142/148): which-2.21-20.fc33.x86_64.rpm 2.8 MB/s | 41 kB 00:00 (143/148): xxhash-libs-0.8.0-1.fc33.x86_64.rpm 3.3 MB/s | 41 kB 00:00 (144/148): xz-5.2.5-3.fc33.x86_64.rpm 60 MB/s | 216 kB 00:00 (145/148): xz-libs-5.2.5-3.fc33.x86_64.rpm 18 MB/s | 92 kB 00:00 (146/148): zip-3.0-27.fc33.x86_64.rpm 26 MB/s | 258 kB 00:00 (147/148): zlib-1.2.11-23.fc34.x86_64.rpm 11 MB/s | 92 kB 00:00 (148/148): zstd-1.4.5-6.fc34.x86_64.rpm 42 MB/s | 539 kB 00:00 -------------------------------------------------------------------------------- Total 70 MB/s | 57 MB 00:00 warning: /var/lib/mock/fedora-rawhide-x86_64-1607008665.209942/root/var/cache/dnf/fedora-2d95c80a1fa0a67d/packages/alternatives-1.14-3.fc33.x86_64.rpm: Header V4 RSA/SHA256 Signature, key ID 45719a39: NOKEY fedora 1.6 MB/s | 1.6 kB 00:00 Importing GPG key 0x45719A39: Userid : "Fedora (34) " Fingerprint: 8C5B A699 0BDB 26E1 9F2A 1A80 1161 AE69 4571 9A39 From : /usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-34-primary Key imported successfully fedora 1.6 MB/s | 1.6 kB 00:00 GPG key at file:///usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-34-primary (0x45719A39) is already installed fedora 1.6 MB/s | 1.6 kB 00:00 Importing GPG key 0x9570FF31: Userid : "Fedora (33) " Fingerprint: 963A 2BEB 0200 9608 FE67 EA42 49FD 7749 9570 FF31 From : /usr/share/distribution-gpg-keys/fedora/RPM-GPG-KEY-fedora-33-primary Key imported successfully Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Running scriptlet: filesystem-3.14-4.fc34.x86_64 1/1 Preparing : 1/1 Installing : libgcc-10.2.1-9.fc34.x86_64 1/148 Running scriptlet: libgcc-10.2.1-9.fc34.x86_64 1/148 Installing : crypto-policies-20200918-1.git85dccc5.fc34.noarc 2/148 Running scriptlet: crypto-policies-20200918-1.git85dccc5.fc34.noarc 2/148 Installing : fedora-release-identity-basic-34-0.9.noarch 3/148 Installing : tzdata-2020d-1.fc34.noarch 4/148 Installing : rust-srpm-macros-16-1.fc34.noarch 5/148 Installing : qt5-srpm-macros-5.15.2-1.fc34.noarch 6/148 Installing : publicsuffix-list-dafsa-20190417-4.fc33.noarch 7/148 Installing : pkgconf-m4-1.7.3-5.fc34.noarch 8/148 Installing : perl-srpm-macros-1-38.fc33.noarch 9/148 Installing : pcre2-syntax-10.36-0.1.RC1.fc34.noarch 10/148 Installing : openblas-srpm-macros-2-8.fc33.noarch 11/148 Installing : ocaml-srpm-macros-6-3.fc33.noarch 12/148 Installing : nim-srpm-macros-3-3.fc33.noarch 13/148 Installing : ncurses-base-6.2-3.20200222.fc33.noarch 14/148 Installing : libssh-config-0.9.5-1.fc34.noarch 15/148 Installing : kernel-srpm-macros-1.0-3.fc33.noarch 16/148 Installing : gnat-srpm-macros-4-12.fc33.noarch 17/148 Installing : ghc-srpm-macros-1.5.0-3.fc33.noarch 18/148 Installing : fpc-srpm-macros-1.3-2.fc33.noarch 19/148 Installing : fedora-gpg-keys-34-0.8.noarch 20/148 Installing : fedora-release-34-0.9.noarch 21/148 Installing : fedora-release-common-34-0.9.noarch 22/148 Installing : fedora-repos-rawhide-34-0.8.noarch 23/148 Installing : fedora-repos-34-0.8.noarch 24/148 Installing : setup-2.13.7-2.fc33.noarch 25/148 warning: /etc/hosts created as /etc/hosts.rpmnew Running scriptlet: setup-2.13.7-2.fc33.noarch 25/148 Installing : filesystem-3.14-4.fc34.x86_64 26/148 Installing : basesystem-11-10.fc33.noarch 27/148 Installing : glibc-minimal-langpack-2.32.9000-17.fc34.x86_64 28/148 Installing : glibc-common-2.32.9000-17.fc34.x86_64 29/148 Running scriptlet: glibc-2.32.9000-17.fc34.x86_64 30/148 Installing : glibc-2.32.9000-17.fc34.x86_64 30/148 Running scriptlet: glibc-2.32.9000-17.fc34.x86_64 30/148 Installing : ncurses-libs-6.2-3.20200222.fc33.x86_64 31/148 Installing : bash-5.0.17-2.fc33.x86_64 32/148 Running scriptlet: bash-5.0.17-2.fc33.x86_64 32/148 Installing : zlib-1.2.11-23.fc34.x86_64 33/148 Installing : bzip2-libs-1.0.8-4.fc33.x86_64 34/148 Installing : xz-libs-5.2.5-3.fc33.x86_64 35/148 Installing : elfutils-libelf-0.182-1.fc34.x86_64 36/148 Installing : libstdc++-10.2.1-9.fc34.x86_64 37/148 Installing : libxcrypt-4.4.17-1.fc34.x86_64 38/148 Installing : libzstd-1.4.5-6.fc34.x86_64 39/148 Installing : readline-8.0-5.fc33.x86_64 40/148 Installing : gmp-1:6.2.0-5.fc34.x86_64 41/148 Installing : libattr-2.4.48-10.fc33.x86_64 42/148 Installing : libacl-2.2.53-9.fc34.x86_64 43/148 Installing : libcap-2.44-1.fc34.x86_64 44/148 Installing : libcom_err-1.45.6-4.fc33.x86_64 45/148 Installing : libdb-5.3.28-44.fc33.x86_64 46/148 Installing : libuuid-2.36.1-2.fc34.x86_64 47/148 Installing : popt-1.18-2.fc33.x86_64 48/148 Installing : libunistring-0.9.10-9.fc33.x86_64 49/148 Installing : libidn2-2.3.0-4.fc33.x86_64 50/148 Installing : mpfr-4.1.0-2.fc33.x86_64 51/148 Installing : unzip-6.0-49.fc33.x86_64 52/148 Installing : file-libs-5.39-3.fc34.x86_64 53/148 Installing : file-5.39-3.fc34.x86_64 54/148 Installing : sqlite-libs-3.33.0-2.fc34.x86_64 55/148 Installing : alternatives-1.14-3.fc33.x86_64 56/148 Installing : libcap-ng-0.8.1-2.fc34.x86_64 57/148 Installing : audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_ 58/148 Installing : libffi-3.1-26.fc33.x86_64 59/148 Installing : p11-kit-0.23.21-2.fc34.x86_64 60/148 Installing : libsepol-3.1-5.fc34.x86_64 61/148 Installing : lua-libs-5.4.1-1.fc34.x86_64 62/148 Installing : lz4-libs-1.9.1-3.fc33.x86_64 63/148 Installing : pcre2-10.36-0.1.RC1.fc34.x86_64 64/148 Installing : libselinux-3.1-5.fc34.x86_64 65/148 Installing : sed-4.8-6.fc34.x86_64 66/148 Installing : findutils-1:4.7.0-7.fc33.x86_64 67/148 Installing : libsemanage-3.1-5.fc34.x86_64 68/148 Installing : shadow-utils-2:4.8.1-6.fc34.x86_64 69/148 Running scriptlet: libutempter-1.2.1-3.fc34.x86_64 70/148 Installing : libutempter-1.2.1-3.fc34.x86_64 70/148 Installing : tar-2:1.32-6.fc33.x86_64 71/148 Installing : zip-3.0-27.fc33.x86_64 72/148 Installing : libpsl-0.21.1-2.fc33.x86_64 73/148 Installing : gc-8.0.4-4.fc33.x86_64 74/148 Installing : zstd-1.4.5-6.fc34.x86_64 75/148 Installing : dwz-0.13-4.fc33.x86_64 76/148 Installing : libxml2-2.9.10-9.fc34.x86_64 77/148 Installing : bzip2-1.0.8-4.fc33.x86_64 78/148 Installing : info-6.7-8.fc33.x86_64 79/148 Installing : ed-1.14.2-9.fc33.x86_64 80/148 Installing : patch-2.7.6-13.fc33.x86_64 81/148 Installing : elfutils-default-yama-scope-0.182-1.fc34.noarch 82/148 Running scriptlet: elfutils-default-yama-scope-0.182-1.fc34.noarch 82/148 Installing : cpio-2.13-8.fc33.x86_64 83/148 Installing : diffutils-3.7-7.fc34.x86_64 84/148 Installing : expat-2.2.10-1.fc34.x86_64 85/148 Installing : libmetalink-0.1.3-13.fc33.x86_64 86/148 Installing : keyutils-libs-1.6-5.fc33.x86_64 87/148 Installing : libbrotli-1.0.9-3.fc34.x86_64 88/148 Installing : libeconf-0.3.8-4.fc33.x86_64 89/148 Installing : libgomp-10.2.1-9.fc34.x86_64 90/148 Installing : libgpg-error-1.39-1.fc34.x86_64 91/148 Installing : libgcrypt-1.8.7-1.fc34.x86_64 92/148 Installing : libnghttp2-1.42.0-1.fc34.x86_64 93/148 Installing : libpkgconf-1.7.3-5.fc34.x86_64 94/148 Installing : pkgconf-1.7.3-5.fc34.x86_64 95/148 Installing : pkgconf-pkg-config-1.7.3-5.fc34.x86_64 96/148 Installing : libsigsegv-2.11-11.fc33.x86_64 97/148 Installing : gawk-5.1.0-2.fc33.x86_64 98/148 Installing : libsmartcols-2.36.1-2.fc34.x86_64 99/148 Installing : libtasn1-4.16.0-3.fc33.x86_64 100/148 Installing : p11-kit-trust-0.23.21-2.fc34.x86_64 101/148 Running scriptlet: p11-kit-trust-0.23.21-2.fc34.x86_64 101/148 Installing : libtool-ltdl-2.4.6-36.fc33.x86_64 102/148 Installing : libverto-0.3.0-11.fc34.x86_64 103/148 Installing : pcre-8.44-2.fc34.x86_64 104/148 Installing : grep-3.6-1.fc34.x86_64 105/148 Installing : xz-5.2.5-3.fc33.x86_64 106/148 Installing : xxhash-libs-0.8.0-1.fc33.x86_64 107/148 Installing : coreutils-common-8.32-14.fc34.x86_64 108/148 Installing : openssl-libs-1:1.1.1h-1.fc34.x86_64 109/148 Installing : coreutils-8.32-14.fc34.x86_64 110/148 Running scriptlet: ca-certificates-2020.2.41-4.fc33.noarch 111/148 Installing : ca-certificates-2020.2.41-4.fc33.noarch 111/148 Running scriptlet: ca-certificates-2020.2.41-4.fc33.noarch 111/148 Installing : krb5-libs-1.18.3-4.fc34.x86_64 112/148 Installing : libblkid-2.36.1-2.fc34.x86_64 113/148 Running scriptlet: libblkid-2.36.1-2.fc34.x86_64 113/148 Installing : libtirpc-1.2.6-2.rc4.fc33.x86_64 114/148 Installing : gzip-1.10-3.fc33.x86_64 115/148 Installing : cracklib-2.9.6-24.fc33.x86_64 116/148 Installing : libnsl2-1.3.0-1.fc34.x86_64 117/148 Installing : libpwquality-1.4.4-1.fc34.x86_64 118/148 Installing : pam-1.5.1-2.fc34.x86_64 119/148 Installing : libfdisk-2.36.1-2.fc34.x86_64 120/148 Installing : libmount-2.36.1-2.fc34.x86_64 121/148 Installing : cyrus-sasl-lib-2.1.27-6.fc33.x86_64 122/148 Installing : openldap-2.4.56-1.fc34.x86_64 123/148 Installing : libssh-0.9.5-1.fc34.x86_64 124/148 Installing : libcurl-7.73.0-2.fc34.x86_64 125/148 Installing : elfutils-libs-0.182-1.fc34.x86_64 126/148 Installing : elfutils-debuginfod-client-0.182-1.fc34.x86_64 127/148 Installing : binutils-gold-2.35.1-16.fc34.x86_64 128/148 Installing : binutils-2.35.1-16.fc34.x86_64 129/148 Running scriptlet: binutils-2.35.1-16.fc34.x86_64 129/148 Installing : elfutils-0.182-1.fc34.x86_64 130/148 Installing : gdb-minimal-10.1-1.fc34.x86_64 131/148 Installing : curl-7.73.0-2.fc34.x86_64 132/148 Installing : guile22-2.2.7-1.fc34.x86_64 133/148 Installing : systemd-libs-247.1-1.fc34.x86_64 134/148 Running scriptlet: systemd-libs-247.1-1.fc34.x86_64 134/148 Installing : libarchive-3.4.3-3.fc33.x86_64 135/148 Installing : rpm-4.16.0-5.fc34.x86_64 136/148 Installing : rpm-libs-4.16.0-5.fc34.x86_64 137/148 Installing : rpm-build-libs-4.16.0-5.fc34.x86_64 138/148 Installing : efi-srpm-macros-4-5.fc33.noarch 139/148 Installing : fonts-srpm-macros-1:2.0.5-4.fc33.noarch 140/148 Installing : go-srpm-macros-3.0.9-1.fc34.noarch 141/148 Installing : lua-srpm-macros-1-2.fc34.noarch 142/148 Installing : python-srpm-macros-3.9-10.fc34.noarch 143/148 Installing : redhat-rpm-config-177-1.fc34.noarch 144/148 Installing : rpm-build-4.16.0-5.fc34.x86_64 145/148 Installing : util-linux-2.36.1-2.fc34.x86_64 146/148 Running scriptlet: util-linux-2.36.1-2.fc34.x86_64 146/148 Installing : make-1:4.3-2.fc33.x86_64 147/148 Installing : which-2.21-20.fc33.x86_64 148/148 Running scriptlet: filesystem-3.14-4.fc34.x86_64 148/148 Running scriptlet: ca-certificates-2020.2.41-4.fc33.noarch 148/148 Running scriptlet: rpm-4.16.0-5.fc34.x86_64 148/148 Running scriptlet: which-2.21-20.fc33.x86_64 148/148 Verifying : alternatives-1.14-3.fc33.x86_64 1/148 Verifying : audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_ 2/148 Verifying : basesystem-11-10.fc33.noarch 3/148 Verifying : bash-5.0.17-2.fc33.x86_64 4/148 Verifying : binutils-2.35.1-16.fc34.x86_64 5/148 Verifying : binutils-gold-2.35.1-16.fc34.x86_64 6/148 Verifying : bzip2-1.0.8-4.fc33.x86_64 7/148 Verifying : bzip2-libs-1.0.8-4.fc33.x86_64 8/148 Verifying : ca-certificates-2020.2.41-4.fc33.noarch 9/148 Verifying : coreutils-8.32-14.fc34.x86_64 10/148 Verifying : coreutils-common-8.32-14.fc34.x86_64 11/148 Verifying : cpio-2.13-8.fc33.x86_64 12/148 Verifying : cracklib-2.9.6-24.fc33.x86_64 13/148 Verifying : crypto-policies-20200918-1.git85dccc5.fc34.noarc 14/148 Verifying : curl-7.73.0-2.fc34.x86_64 15/148 Verifying : cyrus-sasl-lib-2.1.27-6.fc33.x86_64 16/148 Verifying : diffutils-3.7-7.fc34.x86_64 17/148 Verifying : dwz-0.13-4.fc33.x86_64 18/148 Verifying : ed-1.14.2-9.fc33.x86_64 19/148 Verifying : efi-srpm-macros-4-5.fc33.noarch 20/148 Verifying : elfutils-0.182-1.fc34.x86_64 21/148 Verifying : elfutils-debuginfod-client-0.182-1.fc34.x86_64 22/148 Verifying : elfutils-default-yama-scope-0.182-1.fc34.noarch 23/148 Verifying : elfutils-libelf-0.182-1.fc34.x86_64 24/148 Verifying : elfutils-libs-0.182-1.fc34.x86_64 25/148 Verifying : expat-2.2.10-1.fc34.x86_64 26/148 Verifying : fedora-gpg-keys-34-0.8.noarch 27/148 Verifying : fedora-release-34-0.9.noarch 28/148 Verifying : fedora-release-common-34-0.9.noarch 29/148 Verifying : fedora-release-identity-basic-34-0.9.noarch 30/148 Verifying : fedora-repos-34-0.8.noarch 31/148 Verifying : fedora-repos-rawhide-34-0.8.noarch 32/148 Verifying : file-5.39-3.fc34.x86_64 33/148 Verifying : file-libs-5.39-3.fc34.x86_64 34/148 Verifying : filesystem-3.14-4.fc34.x86_64 35/148 Verifying : findutils-1:4.7.0-7.fc33.x86_64 36/148 Verifying : fonts-srpm-macros-1:2.0.5-4.fc33.noarch 37/148 Verifying : fpc-srpm-macros-1.3-2.fc33.noarch 38/148 Verifying : gawk-5.1.0-2.fc33.x86_64 39/148 Verifying : gc-8.0.4-4.fc33.x86_64 40/148 Verifying : gdb-minimal-10.1-1.fc34.x86_64 41/148 Verifying : ghc-srpm-macros-1.5.0-3.fc33.noarch 42/148 Verifying : glibc-2.32.9000-17.fc34.x86_64 43/148 Verifying : glibc-common-2.32.9000-17.fc34.x86_64 44/148 Verifying : glibc-minimal-langpack-2.32.9000-17.fc34.x86_64 45/148 Verifying : gmp-1:6.2.0-5.fc34.x86_64 46/148 Verifying : gnat-srpm-macros-4-12.fc33.noarch 47/148 Verifying : go-srpm-macros-3.0.9-1.fc34.noarch 48/148 Verifying : grep-3.6-1.fc34.x86_64 49/148 Verifying : guile22-2.2.7-1.fc34.x86_64 50/148 Verifying : gzip-1.10-3.fc33.x86_64 51/148 Verifying : info-6.7-8.fc33.x86_64 52/148 Verifying : kernel-srpm-macros-1.0-3.fc33.noarch 53/148 Verifying : keyutils-libs-1.6-5.fc33.x86_64 54/148 Verifying : krb5-libs-1.18.3-4.fc34.x86_64 55/148 Verifying : libacl-2.2.53-9.fc34.x86_64 56/148 Verifying : libarchive-3.4.3-3.fc33.x86_64 57/148 Verifying : libattr-2.4.48-10.fc33.x86_64 58/148 Verifying : libblkid-2.36.1-2.fc34.x86_64 59/148 Verifying : libbrotli-1.0.9-3.fc34.x86_64 60/148 Verifying : libcap-2.44-1.fc34.x86_64 61/148 Verifying : libcap-ng-0.8.1-2.fc34.x86_64 62/148 Verifying : libcom_err-1.45.6-4.fc33.x86_64 63/148 Verifying : libcurl-7.73.0-2.fc34.x86_64 64/148 Verifying : libdb-5.3.28-44.fc33.x86_64 65/148 Verifying : libeconf-0.3.8-4.fc33.x86_64 66/148 Verifying : libfdisk-2.36.1-2.fc34.x86_64 67/148 Verifying : libffi-3.1-26.fc33.x86_64 68/148 Verifying : libgcc-10.2.1-9.fc34.x86_64 69/148 Verifying : libgcrypt-1.8.7-1.fc34.x86_64 70/148 Verifying : libgomp-10.2.1-9.fc34.x86_64 71/148 Verifying : libgpg-error-1.39-1.fc34.x86_64 72/148 Verifying : libidn2-2.3.0-4.fc33.x86_64 73/148 Verifying : libmetalink-0.1.3-13.fc33.x86_64 74/148 Verifying : libmount-2.36.1-2.fc34.x86_64 75/148 Verifying : libnghttp2-1.42.0-1.fc34.x86_64 76/148 Verifying : libnsl2-1.3.0-1.fc34.x86_64 77/148 Verifying : libpkgconf-1.7.3-5.fc34.x86_64 78/148 Verifying : libpsl-0.21.1-2.fc33.x86_64 79/148 Verifying : libpwquality-1.4.4-1.fc34.x86_64 80/148 Verifying : libselinux-3.1-5.fc34.x86_64 81/148 Verifying : libsemanage-3.1-5.fc34.x86_64 82/148 Verifying : libsepol-3.1-5.fc34.x86_64 83/148 Verifying : libsigsegv-2.11-11.fc33.x86_64 84/148 Verifying : libsmartcols-2.36.1-2.fc34.x86_64 85/148 Verifying : libssh-0.9.5-1.fc34.x86_64 86/148 Verifying : libssh-config-0.9.5-1.fc34.noarch 87/148 Verifying : libstdc++-10.2.1-9.fc34.x86_64 88/148 Verifying : libtasn1-4.16.0-3.fc33.x86_64 89/148 Verifying : libtirpc-1.2.6-2.rc4.fc33.x86_64 90/148 Verifying : libtool-ltdl-2.4.6-36.fc33.x86_64 91/148 Verifying : libunistring-0.9.10-9.fc33.x86_64 92/148 Verifying : libutempter-1.2.1-3.fc34.x86_64 93/148 Verifying : libuuid-2.36.1-2.fc34.x86_64 94/148 Verifying : libverto-0.3.0-11.fc34.x86_64 95/148 Verifying : libxcrypt-4.4.17-1.fc34.x86_64 96/148 Verifying : libxml2-2.9.10-9.fc34.x86_64 97/148 Verifying : libzstd-1.4.5-6.fc34.x86_64 98/148 Verifying : lua-libs-5.4.1-1.fc34.x86_64 99/148 Verifying : lua-srpm-macros-1-2.fc34.noarch 100/148 Verifying : lz4-libs-1.9.1-3.fc33.x86_64 101/148 Verifying : make-1:4.3-2.fc33.x86_64 102/148 Verifying : mpfr-4.1.0-2.fc33.x86_64 103/148 Verifying : ncurses-base-6.2-3.20200222.fc33.noarch 104/148 Verifying : ncurses-libs-6.2-3.20200222.fc33.x86_64 105/148 Verifying : nim-srpm-macros-3-3.fc33.noarch 106/148 Verifying : ocaml-srpm-macros-6-3.fc33.noarch 107/148 Verifying : openblas-srpm-macros-2-8.fc33.noarch 108/148 Verifying : openldap-2.4.56-1.fc34.x86_64 109/148 Verifying : openssl-libs-1:1.1.1h-1.fc34.x86_64 110/148 Verifying : p11-kit-0.23.21-2.fc34.x86_64 111/148 Verifying : p11-kit-trust-0.23.21-2.fc34.x86_64 112/148 Verifying : pam-1.5.1-2.fc34.x86_64 113/148 Verifying : patch-2.7.6-13.fc33.x86_64 114/148 Verifying : pcre-8.44-2.fc34.x86_64 115/148 Verifying : pcre2-10.36-0.1.RC1.fc34.x86_64 116/148 Verifying : pcre2-syntax-10.36-0.1.RC1.fc34.noarch 117/148 Verifying : perl-srpm-macros-1-38.fc33.noarch 118/148 Verifying : pkgconf-1.7.3-5.fc34.x86_64 119/148 Verifying : pkgconf-m4-1.7.3-5.fc34.noarch 120/148 Verifying : pkgconf-pkg-config-1.7.3-5.fc34.x86_64 121/148 Verifying : popt-1.18-2.fc33.x86_64 122/148 Verifying : publicsuffix-list-dafsa-20190417-4.fc33.noarch 123/148 Verifying : python-srpm-macros-3.9-10.fc34.noarch 124/148 Verifying : qt5-srpm-macros-5.15.2-1.fc34.noarch 125/148 Verifying : readline-8.0-5.fc33.x86_64 126/148 Verifying : redhat-rpm-config-177-1.fc34.noarch 127/148 Verifying : rpm-4.16.0-5.fc34.x86_64 128/148 Verifying : rpm-build-4.16.0-5.fc34.x86_64 129/148 Verifying : rpm-build-libs-4.16.0-5.fc34.x86_64 130/148 Verifying : rpm-libs-4.16.0-5.fc34.x86_64 131/148 Verifying : rust-srpm-macros-16-1.fc34.noarch 132/148 Verifying : sed-4.8-6.fc34.x86_64 133/148 Verifying : setup-2.13.7-2.fc33.noarch 134/148 Verifying : shadow-utils-2:4.8.1-6.fc34.x86_64 135/148 Verifying : sqlite-libs-3.33.0-2.fc34.x86_64 136/148 Verifying : systemd-libs-247.1-1.fc34.x86_64 137/148 Verifying : tar-2:1.32-6.fc33.x86_64 138/148 Verifying : tzdata-2020d-1.fc34.noarch 139/148 Verifying : unzip-6.0-49.fc33.x86_64 140/148 Verifying : util-linux-2.36.1-2.fc34.x86_64 141/148 Verifying : which-2.21-20.fc33.x86_64 142/148 Verifying : xxhash-libs-0.8.0-1.fc33.x86_64 143/148 Verifying : xz-5.2.5-3.fc33.x86_64 144/148 Verifying : xz-libs-5.2.5-3.fc33.x86_64 145/148 Verifying : zip-3.0-27.fc33.x86_64 146/148 Verifying : zlib-1.2.11-23.fc34.x86_64 147/148 Verifying : zstd-1.4.5-6.fc34.x86_64 148/148 Installed: alternatives-1.14-3.fc33.x86_64 audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_64 basesystem-11-10.fc33.noarch bash-5.0.17-2.fc33.x86_64 binutils-2.35.1-16.fc34.x86_64 binutils-gold-2.35.1-16.fc34.x86_64 bzip2-1.0.8-4.fc33.x86_64 bzip2-libs-1.0.8-4.fc33.x86_64 ca-certificates-2020.2.41-4.fc33.noarch coreutils-8.32-14.fc34.x86_64 coreutils-common-8.32-14.fc34.x86_64 cpio-2.13-8.fc33.x86_64 cracklib-2.9.6-24.fc33.x86_64 crypto-policies-20200918-1.git85dccc5.fc34.noarch curl-7.73.0-2.fc34.x86_64 cyrus-sasl-lib-2.1.27-6.fc33.x86_64 diffutils-3.7-7.fc34.x86_64 dwz-0.13-4.fc33.x86_64 ed-1.14.2-9.fc33.x86_64 efi-srpm-macros-4-5.fc33.noarch elfutils-0.182-1.fc34.x86_64 elfutils-debuginfod-client-0.182-1.fc34.x86_64 elfutils-default-yama-scope-0.182-1.fc34.noarch elfutils-libelf-0.182-1.fc34.x86_64 elfutils-libs-0.182-1.fc34.x86_64 expat-2.2.10-1.fc34.x86_64 fedora-gpg-keys-34-0.8.noarch fedora-release-34-0.9.noarch fedora-release-common-34-0.9.noarch fedora-release-identity-basic-34-0.9.noarch fedora-repos-34-0.8.noarch fedora-repos-rawhide-34-0.8.noarch file-5.39-3.fc34.x86_64 file-libs-5.39-3.fc34.x86_64 filesystem-3.14-4.fc34.x86_64 findutils-1:4.7.0-7.fc33.x86_64 fonts-srpm-macros-1:2.0.5-4.fc33.noarch fpc-srpm-macros-1.3-2.fc33.noarch gawk-5.1.0-2.fc33.x86_64 gc-8.0.4-4.fc33.x86_64 gdb-minimal-10.1-1.fc34.x86_64 ghc-srpm-macros-1.5.0-3.fc33.noarch glibc-2.32.9000-17.fc34.x86_64 glibc-common-2.32.9000-17.fc34.x86_64 glibc-minimal-langpack-2.32.9000-17.fc34.x86_64 gmp-1:6.2.0-5.fc34.x86_64 gnat-srpm-macros-4-12.fc33.noarch go-srpm-macros-3.0.9-1.fc34.noarch grep-3.6-1.fc34.x86_64 guile22-2.2.7-1.fc34.x86_64 gzip-1.10-3.fc33.x86_64 info-6.7-8.fc33.x86_64 kernel-srpm-macros-1.0-3.fc33.noarch keyutils-libs-1.6-5.fc33.x86_64 krb5-libs-1.18.3-4.fc34.x86_64 libacl-2.2.53-9.fc34.x86_64 libarchive-3.4.3-3.fc33.x86_64 libattr-2.4.48-10.fc33.x86_64 libblkid-2.36.1-2.fc34.x86_64 libbrotli-1.0.9-3.fc34.x86_64 libcap-2.44-1.fc34.x86_64 libcap-ng-0.8.1-2.fc34.x86_64 libcom_err-1.45.6-4.fc33.x86_64 libcurl-7.73.0-2.fc34.x86_64 libdb-5.3.28-44.fc33.x86_64 libeconf-0.3.8-4.fc33.x86_64 libfdisk-2.36.1-2.fc34.x86_64 libffi-3.1-26.fc33.x86_64 libgcc-10.2.1-9.fc34.x86_64 libgcrypt-1.8.7-1.fc34.x86_64 libgomp-10.2.1-9.fc34.x86_64 libgpg-error-1.39-1.fc34.x86_64 libidn2-2.3.0-4.fc33.x86_64 libmetalink-0.1.3-13.fc33.x86_64 libmount-2.36.1-2.fc34.x86_64 libnghttp2-1.42.0-1.fc34.x86_64 libnsl2-1.3.0-1.fc34.x86_64 libpkgconf-1.7.3-5.fc34.x86_64 libpsl-0.21.1-2.fc33.x86_64 libpwquality-1.4.4-1.fc34.x86_64 libselinux-3.1-5.fc34.x86_64 libsemanage-3.1-5.fc34.x86_64 libsepol-3.1-5.fc34.x86_64 libsigsegv-2.11-11.fc33.x86_64 libsmartcols-2.36.1-2.fc34.x86_64 libssh-0.9.5-1.fc34.x86_64 libssh-config-0.9.5-1.fc34.noarch libstdc++-10.2.1-9.fc34.x86_64 libtasn1-4.16.0-3.fc33.x86_64 libtirpc-1.2.6-2.rc4.fc33.x86_64 libtool-ltdl-2.4.6-36.fc33.x86_64 libunistring-0.9.10-9.fc33.x86_64 libutempter-1.2.1-3.fc34.x86_64 libuuid-2.36.1-2.fc34.x86_64 libverto-0.3.0-11.fc34.x86_64 libxcrypt-4.4.17-1.fc34.x86_64 libxml2-2.9.10-9.fc34.x86_64 libzstd-1.4.5-6.fc34.x86_64 lua-libs-5.4.1-1.fc34.x86_64 lua-srpm-macros-1-2.fc34.noarch lz4-libs-1.9.1-3.fc33.x86_64 make-1:4.3-2.fc33.x86_64 mpfr-4.1.0-2.fc33.x86_64 ncurses-base-6.2-3.20200222.fc33.noarch ncurses-libs-6.2-3.20200222.fc33.x86_64 nim-srpm-macros-3-3.fc33.noarch ocaml-srpm-macros-6-3.fc33.noarch openblas-srpm-macros-2-8.fc33.noarch openldap-2.4.56-1.fc34.x86_64 openssl-libs-1:1.1.1h-1.fc34.x86_64 p11-kit-0.23.21-2.fc34.x86_64 p11-kit-trust-0.23.21-2.fc34.x86_64 pam-1.5.1-2.fc34.x86_64 patch-2.7.6-13.fc33.x86_64 pcre-8.44-2.fc34.x86_64 pcre2-10.36-0.1.RC1.fc34.x86_64 pcre2-syntax-10.36-0.1.RC1.fc34.noarch perl-srpm-macros-1-38.fc33.noarch pkgconf-1.7.3-5.fc34.x86_64 pkgconf-m4-1.7.3-5.fc34.noarch pkgconf-pkg-config-1.7.3-5.fc34.x86_64 popt-1.18-2.fc33.x86_64 publicsuffix-list-dafsa-20190417-4.fc33.noarch python-srpm-macros-3.9-10.fc34.noarch qt5-srpm-macros-5.15.2-1.fc34.noarch readline-8.0-5.fc33.x86_64 redhat-rpm-config-177-1.fc34.noarch rpm-4.16.0-5.fc34.x86_64 rpm-build-4.16.0-5.fc34.x86_64 rpm-build-libs-4.16.0-5.fc34.x86_64 rpm-libs-4.16.0-5.fc34.x86_64 rust-srpm-macros-16-1.fc34.noarch sed-4.8-6.fc34.x86_64 setup-2.13.7-2.fc33.noarch shadow-utils-2:4.8.1-6.fc34.x86_64 sqlite-libs-3.33.0-2.fc34.x86_64 systemd-libs-247.1-1.fc34.x86_64 tar-2:1.32-6.fc33.x86_64 tzdata-2020d-1.fc34.noarch unzip-6.0-49.fc33.x86_64 util-linux-2.36.1-2.fc34.x86_64 which-2.21-20.fc33.x86_64 xxhash-libs-0.8.0-1.fc33.x86_64 xz-5.2.5-3.fc33.x86_64 xz-libs-5.2.5-3.fc33.x86_64 zip-3.0-27.fc33.x86_64 zlib-1.2.11-23.fc34.x86_64 zstd-1.4.5-6.fc34.x86_64 Complete! Finish: dnf install Start: creating root cache Finish: creating root cache Finish: chroot init INFO: Installed packages: INFO: zstd-1.4.5-6.fc34.x86_64 rpm-build-libs-4.16.0-5.fc34.x86_64 redhat-rpm-config-177-1.fc34.noarch libidn2-2.3.0-4.fc33.x86_64 curl-7.73.0-2.fc34.x86_64 libunistring-0.9.10-9.fc33.x86_64 libblkid-2.36.1-2.fc34.x86_64 patch-2.7.6-13.fc33.x86_64 libmetalink-0.1.3-13.fc33.x86_64 lua-libs-5.4.1-1.fc34.x86_64 libtasn1-4.16.0-3.fc33.x86_64 libsepol-3.1-5.fc34.x86_64 libnghttp2-1.42.0-1.fc34.x86_64 guile22-2.2.7-1.fc34.x86_64 libselinux-3.1-5.fc34.x86_64 libeconf-0.3.8-4.fc33.x86_64 glibc-common-2.32.9000-17.fc34.x86_64 libverto-0.3.0-11.fc34.x86_64 sqlite-libs-3.33.0-2.fc34.x86_64 fedora-release-34-0.9.noarch xz-libs-5.2.5-3.fc33.x86_64 pkgconf-1.7.3-5.fc34.x86_64 libutempter-1.2.1-3.fc34.x86_64 libcap-ng-0.8.1-2.fc34.x86_64 libssh-0.9.5-1.fc34.x86_64 gawk-5.1.0-2.fc33.x86_64 libsemanage-3.1-5.fc34.x86_64 pkgconf-m4-1.7.3-5.fc34.noarch zlib-1.2.11-23.fc34.x86_64 ghc-srpm-macros-1.5.0-3.fc33.noarch libattr-2.4.48-10.fc33.x86_64 libxml2-2.9.10-9.fc34.x86_64 nim-srpm-macros-3-3.fc33.noarch basesystem-11-10.fc33.noarch libffi-3.1-26.fc33.x86_64 publicsuffix-list-dafsa-20190417-4.fc33.noarch libxcrypt-4.4.17-1.fc34.x86_64 readline-8.0-5.fc33.x86_64 libgpg-error-1.39-1.fc34.x86_64 bzip2-1.0.8-4.fc33.x86_64 krb5-libs-1.18.3-4.fc34.x86_64 elfutils-libelf-0.182-1.fc34.x86_64 expat-2.2.10-1.fc34.x86_64 dwz-0.13-4.fc33.x86_64 diffutils-3.7-7.fc34.x86_64 xz-5.2.5-3.fc33.x86_64 libcurl-7.73.0-2.fc34.x86_64 coreutils-common-8.32-14.fc34.x86_64 efi-srpm-macros-4-5.fc33.noarch file-5.39-3.fc34.x86_64 openldap-2.4.56-1.fc34.x86_64 ca-certificates-2020.2.41-4.fc33.noarch fedora-release-identity-basic-34-0.9.noarch ocaml-srpm-macros-6-3.fc33.noarch pkgconf-pkg-config-1.7.3-5.fc34.x86_64 fpc-srpm-macros-1.3-2.fc33.noarch kernel-srpm-macros-1.0-3.fc33.noarch pcre-8.44-2.fc34.x86_64 cyrus-sasl-lib-2.1.27-6.fc33.x86_64 filesystem-3.14-4.fc34.x86_64 pcre2-syntax-10.36-0.1.RC1.fc34.noarch keyutils-libs-1.6-5.fc33.x86_64 fedora-gpg-keys-34-0.8.noarch fonts-srpm-macros-2.0.5-4.fc33.noarch openssl-libs-1.1.1h-1.fc34.x86_64 p11-kit-trust-0.23.21-2.fc34.x86_64 libssh-config-0.9.5-1.fc34.noarch zip-3.0-27.fc33.x86_64 mpfr-4.1.0-2.fc33.x86_64 pcre2-10.36-0.1.RC1.fc34.x86_64 libzstd-1.4.5-6.fc34.x86_64 openblas-srpm-macros-2-8.fc33.noarch popt-1.18-2.fc33.x86_64 elfutils-default-yama-scope-0.182-1.fc34.noarch fedora-repos-rawhide-34-0.8.noarch gnat-srpm-macros-4-12.fc33.noarch libgcc-10.2.1-9.fc34.x86_64 go-srpm-macros-3.0.9-1.fc34.noarch file-libs-5.39-3.fc34.x86_64 gdb-minimal-10.1-1.fc34.x86_64 ncurses-base-6.2-3.20200222.fc33.noarch libcap-2.44-1.fc34.x86_64 rpm-build-4.16.0-5.fc34.x86_64 libtirpc-1.2.6-2.rc4.fc33.x86_64 libmount-2.36.1-2.fc34.x86_64 libacl-2.2.53-9.fc34.x86_64 libdb-5.3.28-44.fc33.x86_64 info-6.7-8.fc33.x86_64 gc-8.0.4-4.fc33.x86_64 python-srpm-macros-3.9-10.fc34.noarch libfdisk-2.36.1-2.fc34.x86_64 cracklib-2.9.6-24.fc33.x86_64 tar-1.32-6.fc33.x86_64 binutils-gold-2.35.1-16.fc34.x86_64 libpsl-0.21.1-2.fc33.x86_64 cpio-2.13-8.fc33.x86_64 unzip-6.0-49.fc33.x86_64 libpwquality-1.4.4-1.fc34.x86_64 lz4-libs-1.9.1-3.fc33.x86_64 elfutils-debuginfod-client-0.182-1.fc34.x86_64 libpkgconf-1.7.3-5.fc34.x86_64 setup-2.13.7-2.fc33.noarch shadow-utils-4.8.1-6.fc34.x86_64 grep-3.6-1.fc34.x86_64 crypto-policies-20200918-1.git85dccc5.fc34.noarch binutils-2.35.1-16.fc34.x86_64 libtool-ltdl-2.4.6-36.fc33.x86_64 lua-srpm-macros-1-2.fc34.noarch make-4.3-2.fc33.x86_64 tzdata-2020d-1.fc34.noarch perl-srpm-macros-1-38.fc33.noarch fedora-repos-34-0.8.noarch glibc-minimal-langpack-2.32.9000-17.fc34.x86_64 bash-5.0.17-2.fc33.x86_64 util-linux-2.36.1-2.fc34.x86_64 pam-1.5.1-2.fc34.x86_64 ncurses-libs-6.2-3.20200222.fc33.x86_64 rust-srpm-macros-16-1.fc34.noarch bzip2-libs-1.0.8-4.fc33.x86_64 qt5-srpm-macros-5.15.2-1.fc34.noarch ed-1.14.2-9.fc33.x86_64 libgomp-10.2.1-9.fc34.x86_64 alternatives-1.14-3.fc33.x86_64 xxhash-libs-0.8.0-1.fc33.x86_64 systemd-libs-247.1-1.fc34.x86_64 libbrotli-1.0.9-3.fc34.x86_64 which-2.21-20.fc33.x86_64 gpg-pubkey-45719a39-5f2c0192 libarchive-3.4.3-3.fc33.x86_64 rpm-4.16.0-5.fc34.x86_64 glibc-2.32.9000-17.fc34.x86_64 elfutils-0.182-1.fc34.x86_64 gmp-6.2.0-5.fc34.x86_64 rpm-libs-4.16.0-5.fc34.x86_64 fedora-release-common-34-0.9.noarch libgcrypt-1.8.7-1.fc34.x86_64 libuuid-2.36.1-2.fc34.x86_64 audit-libs-3.0-0.21.20191104git1c2f876.fc33.x86_64 coreutils-8.32-14.fc34.x86_64 gzip-1.10-3.fc33.x86_64 libstdc++-10.2.1-9.fc34.x86_64 elfutils-libs-0.182-1.fc34.x86_64 libsigsegv-2.11-11.fc33.x86_64 gpg-pubkey-9570ff31-5e3006fb p11-kit-0.23.21-2.fc34.x86_64 libcom_err-1.45.6-4.fc33.x86_64 findutils-4.7.0-7.fc33.x86_64 libsmartcols-2.36.1-2.fc34.x86_64 sed-4.8-6.fc34.x86_64 libnsl2-1.3.0-1.fc34.x86_64 Start: buildsrpm Start: rpmbuild -bs Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1606953600 Wrote: /builddir/build/SRPMS/pcem-17-1.fc34.src.rpm Finish: rpmbuild -bs INFO: chroot_scan: 3 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1607008665.209942/root/var/log/dnf.rpm.log /var/lib/mock/fedora-rawhide-x86_64-1607008665.209942/root/var/log/dnf.librepo.log /var/lib/mock/fedora-rawhide-x86_64-1607008665.209942/root/var/log/dnf.log Finish: buildsrpm INFO: Done(/tmp/copr-rpmbuild-ozekdhak/obtain-sources/pcem/pcem.spec) Config(child) 0 minutes 46 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot Finish: run Running (timeout=18000): unbuffer mock --rebuild /var/lib/copr-rpmbuild/results/pcem-17-1.fc34.src.rpm --resultdir /var/lib/copr-rpmbuild/results --uniqueext 1607008712.827806 -r /var/lib/copr-rpmbuild/results/configs/child.cfg INFO: mock.py version 2.6 starting (python version = 3.9.0)... Start: init plugins INFO: tmpfs initialized INFO: selinux enabled INFO: chroot_scan: initialized INFO: compress_logs: initialized Finish: init plugins INFO: Signal handler active Start: run INFO: Start(/var/lib/copr-rpmbuild/results/pcem-17-1.fc34.src.rpm) Config(fedora-rawhide-x86_64) Start: clean chroot Finish: clean chroot Start: chroot init INFO: mounting tmpfs at /var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root. INFO: calling preinit hooks INFO: enabled root cache Start: unpacking root cache Finish: unpacking root cache INFO: enabled package manager cache Start: cleaning package manager metadata Finish: cleaning package manager metadata INFO: enabled HW Info plugin Mock Version: 2.6 INFO: Mock Version: 2.6 Start: dnf update No matches found for the following disable plugin patterns: local, spacewalk Copr repository 194 kB/s | 3.3 kB 00:00 fedora 93 kB/s | 12 kB 00:00 Dependencies resolved. Nothing to do. Complete! Finish: dnf update Finish: chroot init Start: build phase for pcem-17-1.fc34.src.rpm Start: build setup for pcem-17-1.fc34.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1606953600 Wrote: /builddir/build/SRPMS/pcem-17-1.fc34.src.rpm No matches found for the following disable plugin patterns: local, spacewalk Copr repository 198 kB/s | 3.3 kB 00:00 fedora 92 kB/s | 12 kB 00:00 Package make-1:4.3-2.fc33.x86_64 is already installed. Dependencies resolved. ================================================================================ Package Arch Version Repo Size ================================================================================ Installing: SDL2-devel  x86_64 2.0.12-4.fc33 fedora 243 k alsa-lib-devel  x86_64 1.2.4-4.fc34 fedora 775 k desktop-file-utils  x86_64 0.26-2.fc33 fedora 74 k gcc  x86_64 10.2.1-9.fc34 fedora 30 M gcc-c++  x86_64 10.2.1-9.fc34 fedora 11 M git  x86_64 2.29.2-3.fc34 fedora 124 k libappstream-glib  x86_64 0.7.18-1.fc34 fedora 397 k openal-soft-devel  x86_64 1.19.1-9.fc34 fedora 54 k wxGTK3-devel  x86_64 3.0.5.1-2.fc33 fedora 32 k Installing dependencies: SDL2  x86_64 2.0.12-4.fc33 fedora 499 k acl  x86_64 2.2.53-9.fc34 fedora 72 k adwaita-cursor-theme  noarch 3.38.0-1.fc34 fedora 623 k adwaita-icon-theme  noarch 3.38.0-1.fc34 fedora 11 M alsa-lib  x86_64 1.2.4-4.fc34 fedora 475 k annobin  x86_64 9.47-1.fc34 fedora 132 k at-spi2-atk  x86_64 2.38.0-1.fc34 fedora 90 k at-spi2-atk-devel  x86_64 2.38.0-1.fc34 fedora 9.9 k at-spi2-core  x86_64 2.38.0-2.fc34 fedora 172 k at-spi2-core-devel  x86_64 2.38.0-2.fc34 fedora 130 k atk  x86_64 2.36.0-2.fc33 fedora 273 k atk-devel  x86_64 2.36.0-2.fc33 fedora 174 k avahi-libs  x86_64 0.8-6.fc34 fedora 67 k brotli  x86_64 1.0.9-3.fc34 fedora 324 k brotli-devel  x86_64 1.0.9-3.fc34 fedora 32 k bubblewrap  x86_64 0.4.1-2.fc33 fedora 50 k bzip2-devel  x86_64 1.0.8-4.fc33 fedora 214 k cairo  x86_64 1.16.0-9.fc33 fedora 692 k cairo-devel  x86_64 1.16.0-9.fc33 fedora 240 k cairo-gobject  x86_64 1.16.0-9.fc33 fedora 18 k cairo-gobject-devel  x86_64 1.16.0-9.fc33 fedora 10 k cdparanoia-libs  x86_64 10.2-35.fc34 fedora 54 k cmake-filesystem  x86_64 3.18.4-3.fc34 fedora 16 k colord-libs  x86_64 1.4.5-1.fc34 fedora 240 k cpp  x86_64 10.2.1-9.fc34 fedora 9.4 M cryptsetup-libs  x86_64 2.3.4-1.fc34 fedora 476 k cups-libs  x86_64 1:2.3.3-19.fc34 fedora 275 k dbus  x86_64 1:1.12.20-2.fc33 fedora 9.9 k dbus-broker  x86_64 24-1.fc34 fedora 170 k dbus-common  noarch 1:1.12.20-2.fc33 fedora 17 k dbus-devel  x86_64 1:1.12.20-2.fc33 fedora 36 k dbus-libs  x86_64 1:1.12.20-2.fc33 fedora 154 k dejavu-sans-fonts  noarch 2.37-15.fc34 fedora 1.3 M device-mapper  x86_64 1.02.173-1.fc33 fedora 142 k device-mapper-libs  x86_64 1.02.173-1.fc33 fedora 178 k emacs-filesystem  noarch 1:27.1-2.fc34 fedora 8.2 k enchant2  x86_64 2.2.13-1.fc34 fedora 63 k fontconfig  x86_64 2.13.93-2.fc34 fedora 274 k fontconfig-devel  x86_64 2.13.93-2.fc34 fedora 129 k fonts-filesystem  noarch 1:2.0.5-4.fc33 fedora 8.7 k freetype  x86_64 2.10.4-1.fc34 fedora 391 k freetype-devel  x86_64 2.10.4-1.fc34 fedora 1.1 M fribidi  x86_64 1.0.10-3.fc33 fedora 86 k fribidi-devel  x86_64 1.0.10-3.fc33 fedora 25 k gdbm-libs  x86_64 1:1.18.1-5.fc33 fedora 54 k gdk-pixbuf2  x86_64 2.40.0-3.fc33 fedora 463 k gdk-pixbuf2-devel  x86_64 2.40.0-3.fc33 fedora 213 k gdk-pixbuf2-modules  x86_64 2.40.0-3.fc33 fedora 98 k gettext  x86_64 0.21-3.fc34 fedora 1.1 M gettext-libs  x86_64 0.21-3.fc34 fedora 308 k git-core  x86_64 2.29.2-3.fc34 fedora 3.5 M git-core-doc  noarch 2.29.2-3.fc34 fedora 2.2 M gl-manpages  noarch 1.1-21.20190306.fc33 fedora 1.0 M glib-networking  x86_64 2.66.0-1.fc34 fedora 161 k glib2  x86_64 2.67.0-6.fc34 fedora 2.7 M glib2-devel  x86_64 2.67.0-6.fc34 fedora 470 k glibc-devel  x86_64 2.32.9000-17.fc34 fedora 1.1 M glibc-headers-x86  noarch 2.32.9000-17.fc34 fedora 499 k gnutls  x86_64 3.6.15-2.fc34 fedora 925 k graphene  x86_64 1.10.2-5.fc34 fedora 65 k graphite2  x86_64 1.3.14-6.fc34 fedora 95 k graphite2-devel  x86_64 1.3.14-6.fc34 fedora 21 k groff-base  x86_64 1.22.4-4.fc34 fedora 1.1 M gsettings-desktop-schemas  x86_64 3.38.0-1.fc34 fedora 681 k gstreamer1  x86_64 1.18.1-1.fc34 fedora 1.4 M gstreamer1-plugins-base  x86_64 1.18.1-1.fc34 fedora 2.1 M gtk-update-icon-cache  x86_64 3.24.23-2.fc34 fedora 33 k gtk3  x86_64 3.24.23-2.fc34 fedora 4.7 M gtk3-devel  x86_64 3.24.23-2.fc34 fedora 4.3 M harfbuzz  x86_64 2.7.2-1.fc34 fedora 634 k harfbuzz-devel  x86_64 2.7.2-1.fc34 fedora 272 k harfbuzz-icu  x86_64 2.7.2-1.fc34 fedora 15 k hicolor-icon-theme  noarch 0.17-9.fc33 fedora 44 k hunspell  x86_64 1.7.0-7.fc33 fedora 329 k hunspell-en-US  noarch 0.20140811.1-17.fc33 fedora 176 k hwdata  noarch 0.342-1.fc34 fedora 1.4 M hyphen  x86_64 2.8.8-14.fc33 fedora 29 k iptables-libs  x86_64 1.8.6-5.fc34 fedora 367 k isl  x86_64 0.16.1-12.fc33 fedora 876 k iso-codes  noarch 4.5.0-2.fc33 fedora 3.4 M jasper-libs  x86_64 2.0.22-1.fc34 fedora 152 k jbigkit-libs  x86_64 2.1-20.fc34 fedora 52 k json-c  x86_64 0.14-7.fc33 fedora 41 k json-glib  x86_64 1.6.0-1.fc34 fedora 150 k kernel-headers  x86_64 5.10.0-0.rc6.git0.1.fc34 fedora 1.2 M kmod-libs  x86_64 27-3.fc33 fedora 63 k langpacks-core-font-en  noarch 3.0-5.fc34 fedora 9.7 k lcms2  x86_64 2.11-2.fc33 fedora 169 k less  x86_64 551-4.fc33 fedora 154 k libICE  x86_64 1.0.10-5.fc34 fedora 71 k libSM  x86_64 1.2.3-7.fc34 fedora 42 k libX11  x86_64 1.7.0-2.fc34 fedora 660 k libX11-common  noarch 1.7.0-2.fc34 fedora 153 k libX11-devel  x86_64 1.7.0-2.fc34 fedora 940 k libX11-xcb  x86_64 1.7.0-2.fc34 fedora 11 k libXau  x86_64 1.0.9-5.fc34 fedora 31 k libXau-devel  x86_64 1.0.9-5.fc34 fedora 13 k libXcomposite  x86_64 0.4.5-4.fc34 fedora 23 k libXcomposite-devel  x86_64 0.4.5-4.fc34 fedora 16 k libXcursor  x86_64 1.2.0-4.fc34 fedora 29 k libXcursor-devel  x86_64 1.2.0-4.fc34 fedora 22 k libXdamage  x86_64 1.1.5-4.fc34 fedora 22 k libXdamage-devel  x86_64 1.1.5-4.fc34 fedora 9.2 k libXext  x86_64 1.3.4-5.fc34 fedora 39 k libXext-devel  x86_64 1.3.4-5.fc34 fedora 73 k libXfixes  x86_64 5.0.3-13.fc34 fedora 19 k libXfixes-devel  x86_64 5.0.3-13.fc34 fedora 12 k libXft  x86_64 2.3.3-5.fc34 fedora 63 k libXft-devel  x86_64 2.3.3-5.fc34 fedora 18 k libXi  x86_64 1.7.10-5.fc34 fedora 38 k libXi-devel  x86_64 1.7.10-5.fc34 fedora 100 k libXinerama  x86_64 1.1.4-7.fc34 fedora 14 k libXinerama-devel  x86_64 1.1.4-7.fc34 fedora 13 k libXrandr  x86_64 1.5.2-5.fc34 fedora 27 k libXrandr-devel  x86_64 1.5.2-5.fc34 fedora 19 k libXrender  x86_64 0.9.10-13.fc34 fedora 27 k libXrender-devel  x86_64 0.9.10-13.fc34 fedora 16 k libXtst  x86_64 1.2.3-12.fc33 fedora 20 k libXtst-devel  x86_64 1.2.3-12.fc33 fedora 15 k libXv  x86_64 1.0.11-13.fc34 fedora 18 k libXxf86vm  x86_64 1.1.4-15.fc34 fedora 18 k libargon2  x86_64 20171227-5.fc33 fedora 29 k libblkid-devel  x86_64 2.36.1-2.fc34 fedora 14 k libcbor  x86_64 0.7.0-2.fc34 fedora 57 k libdatrie  x86_64 0.2.9-13.fc34 fedora 31 k libdatrie-devel  x86_64 0.2.9-13.fc34 fedora 127 k libdrm  x86_64 2.4.103-1.fc34 fedora 160 k libedit  x86_64 3.1-33.20191231cvs.fc33 fedora 106 k libepoxy  x86_64 1.5.4-3.fc33 fedora 254 k libepoxy-devel  x86_64 1.5.4-3.fc33 fedora 134 k libevent  x86_64 2.1.12-2.fc34 fedora 265 k libffi-devel  x86_64 3.1-26.fc33 fedora 23 k libfido2  x86_64 1.5.0-3.fc34 fedora 69 k libglvnd  x86_64 1:1.3.2-2.fc33 fedora 139 k libglvnd-core-devel  x86_64 1:1.3.2-2.fc33 fedora 18 k libglvnd-devel  x86_64 1:1.3.2-2.fc33 fedora 156 k libglvnd-egl  x86_64 1:1.3.2-2.fc33 fedora 37 k libglvnd-gles  x86_64 1:1.3.2-2.fc33 fedora 33 k libglvnd-glx  x86_64 1:1.3.2-2.fc33 fedora 155 k libglvnd-opengl  x86_64 1:1.3.2-2.fc33 fedora 44 k libgusb  x86_64 0.3.5-1.fc33 fedora 50 k libibverbs-core  x86_64 32.0-1.fc34 fedora 72 k libicu  x86_64 67.1-4.fc33 fedora 9.7 M libicu-devel  x86_64 67.1-4.fc33 fedora 831 k libjpeg-turbo  x86_64 2.0.5-5.fc33 fedora 168 k libmnl  x86_64 1.0.4-12.fc33 fedora 28 k libmount-devel  x86_64 2.36.1-2.fc34 fedora 15 k libmpc  x86_64 1.2.1-1.fc34 fedora 63 k libmspack  x86_64 0.10.1-0.4.alpha.fc33 fedora 70 k libnetfilter_conntrack  x86_64 1.0.7-5.fc33 fedora 62 k libnfnetlink  x86_64 1.0.1-18.fc33 fedora 29 k libnl3  x86_64 3.5.0-5.fc33 fedora 325 k libnotify  x86_64 0.7.9-3.fc33 fedora 43 k libogg  x86_64 2:1.3.4-3.fc33 fedora 33 k libpcap  x86_64 14:1.9.1-6.fc34 fedora 173 k libpciaccess  x86_64 0.16-3.fc33 fedora 26 k libpng  x86_64 2:1.6.37-6.fc34 fedora 120 k libpng-devel  x86_64 2:1.6.37-6.fc34 fedora 291 k libproxy  x86_64 0.4.15-29.fc34 fedora 71 k libseccomp  x86_64 2.5.0-3.fc33 fedora 72 k libsecret  x86_64 0.20.4-1.fc34 fedora 162 k libselinux-devel  x86_64 3.1-5.fc34 fedora 113 k libsepol-devel  x86_64 3.1-5.fc34 fedora 40 k libsoup  x86_64 2.72.0-3.fc34 fedora 398 k libstdc++-devel  x86_64 10.2.1-9.fc34 fedora 2.0 M libstemmer  x86_64 0-15.585svn.fc33 fedora 83 k libtextstyle  x86_64 0.21-3.fc34 fedora 91 k libthai  x86_64 0.1.28-5.fc33 fedora 213 k libthai-devel  x86_64 0.1.28-5.fc33 fedora 119 k libtheora  x86_64 1:1.1.1-28.fc33 fedora 162 k libtiff  x86_64 4.1.0-5.fc34 fedora 185 k libunwind  x86_64 1.4.0-4.fc34 fedora 65 k libusbx  x86_64 1.0.23-2.fc33 fedora 70 k libvisual  x86_64 1:0.4.0-29.fc33 fedora 147 k libvorbis  x86_64 1:1.3.7-2.fc33 fedora 199 k libwayland-client  x86_64 1.18.0-2.fc33 fedora 32 k libwayland-cursor  x86_64 1.18.0-2.fc33 fedora 19 k libwayland-egl  x86_64 1.18.0-2.fc33 fedora 12 k libwayland-server  x86_64 1.18.0-2.fc33 fedora 41 k libwebp  x86_64 1.1.0-5.fc33 fedora 277 k libwpe  x86_64 1.8.0-1.fc34 fedora 27 k libxcb  x86_64 1.13.1-6.fc34 fedora 230 k libxcb-devel  x86_64 1.13.1-6.fc34 fedora 1.0 M libxcrypt-devel  x86_64 4.4.17-1.fc34 fedora 32 k libxkbcommon  x86_64 1.0.3-1.fc34 fedora 135 k libxkbcommon-devel  x86_64 1.0.3-1.fc34 fedora 62 k libxml2-devel  x86_64 2.9.10-9.fc34 fedora 852 k libxshmfence  x86_64 1.3-7.fc33 fedora 11 k libxslt  x86_64 1.1.34-4.fc34 fedora 243 k llvm-libs  x86_64 11.0.0-2.fc34 fedora 22 M mesa-libEGL  x86_64 20.3.0~rc3-2.fc34 fedora 122 k mesa-libEGL-devel  x86_64 20.3.0~rc3-2.fc34 fedora 18 k mesa-libGL  x86_64 20.3.0~rc3-2.fc34 fedora 182 k mesa-libGLU  x86_64 9.0.1-3.fc33 fedora 148 k mesa-libGLU-devel  x86_64 9.0.1-3.fc33 fedora 12 k mesa-libgbm  x86_64 20.3.0~rc3-2.fc34 fedora 42 k mesa-libglapi  x86_64 20.3.0~rc3-2.fc34 fedora 59 k ncurses  x86_64 6.2-3.20200222.fc33 fedora 395 k nettle  x86_64 3.6-3.fc33 fedora 418 k openal-soft  x86_64 1.19.1-9.fc34 fedora 543 k openjpeg2  x86_64 2.3.1-8.fc34 fedora 154 k openssh  x86_64 8.4p1-4.fc34 fedora 419 k openssh-clients  x86_64 8.4p1-4.fc34 fedora 613 k opus  x86_64 1.3.1-7.fc34 fedora 203 k orc  x86_64 0.4.31-3.fc33 fedora 185 k pango  x86_64 1.48.0-1.fc34 fedora 300 k pango-devel  x86_64 1.48.0-1.fc34 fedora 339 k pcre-cpp  x86_64 8.44-2.fc34 fedora 26 k pcre-devel  x86_64 8.44-2.fc34 fedora 471 k pcre-utf16  x86_64 8.44-2.fc34 fedora 185 k pcre-utf32  x86_64 8.44-2.fc34 fedora 175 k pcre2-devel  x86_64 10.36-0.1.RC1.fc34 fedora 476 k pcre2-utf16  x86_64 10.36-0.1.RC1.fc34 fedora 212 k pcre2-utf32  x86_64 10.36-0.1.RC1.fc34 fedora 202 k perl-Carp  noarch 1.50-457.fc33 fedora 29 k perl-Class-Struct  noarch 0.66-467.fc34 fedora 35 k perl-DynaLoader  x86_64 1.47-467.fc34 fedora 41 k perl-Encode  x86_64 4:3.07-457.fc33 fedora 1.7 M perl-Errno  x86_64 1.30-467.fc34 fedora 27 k perl-Error  noarch 1:0.17029-4.fc33 fedora 42 k perl-Exporter  noarch 5.74-458.fc33 fedora 32 k perl-Fcntl  x86_64 1.13-467.fc34 fedora 33 k perl-File-Basename  noarch 2.85-467.fc34 fedora 30 k perl-File-Find  noarch 1.37-467.fc34 fedora 38 k perl-File-Path  noarch 2.18-1.fc34 fedora 36 k perl-File-Temp  noarch 1:0.231.100-1.fc34 fedora 60 k perl-File-stat  noarch 1.09-467.fc34 fedora 30 k perl-Getopt-Long  noarch 1:2.52-1.fc34 fedora 60 k perl-Getopt-Std  noarch 1.12-467.fc34 fedora 28 k perl-Git  noarch 2.29.2-3.fc34 fedora 43 k perl-HTTP-Tiny  noarch 0.076-457.fc33 fedora 55 k perl-IO  x86_64 1.43-467.fc34 fedora 100 k perl-IPC-Open3  noarch 1.21-467.fc34 fedora 35 k perl-MIME-Base64  x86_64 3.16-1.fc34 fedora 30 k perl-POSIX  x86_64 1.94-467.fc34 fedora 111 k perl-PathTools  x86_64 3.78-458.fc34 fedora 86 k perl-Pod-Escapes  noarch 1:1.07-457.fc33 fedora 20 k perl-Pod-Perldoc  noarch 3.28.01-458.fc33 fedora 84 k perl-Pod-Simple  noarch 1:3.42-1.fc34 fedora 216 k perl-Pod-Usage  noarch 4:2.01-1.fc34 fedora 41 k perl-Scalar-List-Utils  x86_64 4:1.55-457.fc33 fedora 70 k perl-SelectSaver  noarch 1.02-467.fc34 fedora 24 k perl-Socket  x86_64 4:2.030-2.fc33 fedora 55 k perl-Storable  x86_64 1:3.21-457.fc33 fedora 97 k perl-Symbol  noarch 1.08-467.fc34 fedora 27 k perl-Term-ANSIColor  noarch 5.01-458.fc33 fedora 49 k perl-Term-Cap  noarch 1.17-457.fc33 fedora 22 k perl-TermReadKey  x86_64 2.38-8.fc33 fedora 36 k perl-Text-ParseWords  noarch 3.30-457.fc33 fedora 16 k perl-Text-Tabs+Wrap  noarch 2013.0523-457.fc33 fedora 23 k perl-Time-Local  noarch 2:1.300-4.fc33 fedora 34 k perl-constant  noarch 1.33-458.fc33 fedora 23 k perl-if  noarch 0.60.800-467.fc34 fedora 26 k perl-interpreter  x86_64 4:5.32.0-467.fc34 fedora 84 k perl-lib  x86_64 0.65-467.fc34 fedora 27 k perl-libs  x86_64 4:5.32.0-467.fc34 fedora 2.1 M perl-mro  x86_64 1.23-467.fc34 fedora 41 k perl-overload  noarch 1.31-467.fc34 fedora 58 k perl-overloading  noarch 0.02-467.fc34 fedora 25 k perl-parent  noarch 1:0.238-457.fc33 fedora 14 k perl-podlators  noarch 1:4.14-457.fc33 fedora 113 k perl-subs  noarch 1.03-467.fc34 fedora 24 k perl-vars  noarch 1.05-467.fc34 fedora 25 k pixman  x86_64 0.40.0-2.fc33 fedora 275 k pixman-devel  x86_64 0.40.0-2.fc33 fedora 17 k python-pip-wheel  noarch 20.2.4-1.fc34 fedora 1.3 M python-setuptools-wheel  noarch 50.3.2-1.fc34 fedora 471 k python3  x86_64 3.9.1~rc1-1.fc34 fedora 28 k python3-libs  x86_64 3.9.1~rc1-1.fc34 fedora 7.4 M rest  x86_64 0.8.1-8.fc33 fedora 69 k shared-mime-info  x86_64 2.0-5.fc34 fedora 371 k systemd  x86_64 247.1-1.fc34 fedora 4.2 M systemd-pam  x86_64 247.1-1.fc34 fedora 312 k systemd-rpm-macros  noarch 247.1-1.fc34 fedora 26 k wayland-devel  x86_64 1.18.0-2.fc33 fedora 132 k wayland-protocols-devel  noarch 1.20-2.fc33 fedora 74 k webkit2gtk3  x86_64 2.30.3-1.fc34 fedora 16 M webkit2gtk3-jsc  x86_64 2.30.3-1.fc34 fedora 6.1 M woff2  x86_64 1.0.2-9.fc33 fedora 60 k wpebackend-fdo  x86_64 1.8.0-1.fc34 fedora 41 k wxBase3  x86_64 3.0.5.1-2.fc33 fedora 979 k wxBase3-devel  x86_64 3.0.5.1-2.fc33 fedora 1.1 M wxGTK3  x86_64 3.0.5.1-2.fc33 fedora 4.4 M wxGTK3-gl  x86_64 3.0.5.1-2.fc33 fedora 38 k wxGTK3-i18n  noarch 3.0.5.1-2.fc33 fedora 528 k wxGTK3-media  x86_64 3.0.5.1-2.fc33 fedora 54 k wxGTK3-webview  x86_64 3.0.5.1-2.fc33 fedora 60 k xdg-dbus-proxy  x86_64 0.1.2-3.fc33 fedora 43 k xkeyboard-config  noarch 2.31-3.fc34 fedora 750 k xml-common  noarch 0.6.3-55.fc33 fedora 31 k xorg-x11-proto-devel  noarch 2019.1-5.fc34 fedora 261 k xz-devel  x86_64 5.2.5-3.fc33 fedora 52 k zlib-devel  x86_64 1.2.11-23.fc34 fedora 44 k Transaction Summary ================================================================================ Install 302 Packages Total download size: 212 M Installed size: 774 M Downloading Packages: (1/302): acl-2.2.53-9.fc34.x86_64.rpm 2.3 MB/s | 72 kB 00:00 (2/302): SDL2-devel-2.0.12-4.fc33.x86_64.rpm 7.1 MB/s | 243 kB 00:00 (3/302): SDL2-2.0.12-4.fc33.x86_64.rpm 13 MB/s | 499 kB 00:00 (4/302): adwaita-cursor-theme-3.38.0-1.fc34.noa 32 MB/s | 623 kB 00:00 (5/302): alsa-lib-1.2.4-4.fc34.x86_64.rpm 25 MB/s | 475 kB 00:00 (6/302): annobin-9.47-1.fc34.x86_64.rpm 23 MB/s | 132 kB 00:00 (7/302): at-spi2-atk-2.38.0-1.fc34.x86_64.rpm 19 MB/s | 90 kB 00:00 (8/302): at-spi2-atk-devel-2.38.0-1.fc34.x86_64 3.5 MB/s | 9.9 kB 00:00 (9/302): at-spi2-core-2.38.0-2.fc34.x86_64.rpm 31 MB/s | 172 kB 00:00 (10/302): alsa-lib-devel-1.2.4-4.fc34.x86_64.rp 26 MB/s | 775 kB 00:00 (11/302): at-spi2-core-devel-2.38.0-2.fc34.x86_ 17 MB/s | 130 kB 00:00 (12/302): atk-devel-2.36.0-2.fc33.x86_64.rpm 29 MB/s | 174 kB 00:00 (13/302): atk-2.36.0-2.fc33.x86_64.rpm 21 MB/s | 273 kB 00:00 (14/302): avahi-libs-0.8-6.fc34.x86_64.rpm 7.6 MB/s | 67 kB 00:00 (15/302): brotli-1.0.9-3.fc34.x86_64.rpm 42 MB/s | 324 kB 00:00 (16/302): brotli-devel-1.0.9-3.fc34.x86_64.rpm 6.7 MB/s | 32 kB 00:00 (17/302): bzip2-devel-1.0.8-4.fc33.x86_64.rpm 32 MB/s | 214 kB 00:00 (18/302): cairo-1.16.0-9.fc33.x86_64.rpm 52 MB/s | 692 kB 00:00 (19/302): cairo-devel-1.16.0-9.fc33.x86_64.rpm 21 MB/s | 240 kB 00:00 (20/302): bubblewrap-0.4.1-2.fc33.x86_64.rpm 1.3 MB/s | 50 kB 00:00 (21/302): cairo-gobject-1.16.0-9.fc33.x86_64.rp 5.0 MB/s | 18 kB 00:00 (22/302): cairo-gobject-devel-1.16.0-9.fc33.x86 3.1 MB/s | 10 kB 00:00 (23/302): cdparanoia-libs-10.2-35.fc34.x86_64.r 15 MB/s | 54 kB 00:00 (24/302): cmake-filesystem-3.18.4-3.fc34.x86_64 4.5 MB/s | 16 kB 00:00 (25/302): colord-libs-1.4.5-1.fc34.x86_64.rpm 28 MB/s | 240 kB 00:00 (26/302): adwaita-icon-theme-3.38.0-1.fc34.noar 58 MB/s | 11 MB 00:00 (27/302): cryptsetup-libs-2.3.4-1.fc34.x86_64.r 7.3 MB/s | 476 kB 00:00 (28/302): cups-libs-2.3.3-19.fc34.x86_64.rpm 16 MB/s | 275 kB 00:00 (29/302): dbus-1.12.20-2.fc33.x86_64.rpm 1.0 MB/s | 9.9 kB 00:00 (30/302): dbus-common-1.12.20-2.fc33.noarch.rpm 5.2 MB/s | 17 kB 00:00 (31/302): dbus-broker-24-1.fc34.x86_64.rpm 16 MB/s | 170 kB 00:00 (32/302): dbus-devel-1.12.20-2.fc33.x86_64.rpm 7.4 MB/s | 36 kB 00:00 (33/302): dbus-libs-1.12.20-2.fc33.x86_64.rpm 24 MB/s | 154 kB 00:00 (34/302): desktop-file-utils-0.26-2.fc33.x86_64 16 MB/s | 74 kB 00:00 (35/302): device-mapper-1.02.173-1.fc33.x86_64. 27 MB/s | 142 kB 00:00 (36/302): dejavu-sans-fonts-2.37-15.fc34.noarch 54 MB/s | 1.3 MB 00:00 (37/302): device-mapper-libs-1.02.173-1.fc33.x8 14 MB/s | 178 kB 00:00 (38/302): emacs-filesystem-27.1-2.fc34.noarch.r 1.2 MB/s | 8.2 kB 00:00 (39/302): enchant2-2.2.13-1.fc34.x86_64.rpm 17 MB/s | 63 kB 00:00 (40/302): fontconfig-2.13.93-2.fc34.x86_64.rpm 34 MB/s | 274 kB 00:00 (41/302): fontconfig-devel-2.13.93-2.fc34.x86_6 17 MB/s | 129 kB 00:00 (42/302): fonts-filesystem-2.0.5-4.fc33.noarch. 2.5 MB/s | 8.7 kB 00:00 (43/302): freetype-2.10.4-1.fc34.x86_64.rpm 33 MB/s | 391 kB 00:00 (44/302): fribidi-1.0.10-3.fc33.x86_64.rpm 8.1 MB/s | 86 kB 00:00 (45/302): fribidi-devel-1.0.10-3.fc33.x86_64.rp 2.6 MB/s | 25 kB 00:00 (46/302): freetype-devel-2.10.4-1.fc34.x86_64.r 26 MB/s | 1.1 MB 00:00 (47/302): cpp-10.2.1-9.fc34.x86_64.rpm 35 MB/s | 9.4 MB 00:00 (48/302): gdbm-libs-1.18.1-5.fc33.x86_64.rpm 4.1 MB/s | 54 kB 00:00 (49/302): gdk-pixbuf2-2.40.0-3.fc33.x86_64.rpm 35 MB/s | 463 kB 00:00 (50/302): gdk-pixbuf2-devel-2.40.0-3.fc33.x86_6 27 MB/s | 213 kB 00:00 (51/302): gdk-pixbuf2-modules-2.40.0-3.fc33.x86 16 MB/s | 98 kB 00:00 (52/302): gcc-c++-10.2.1-9.fc34.x86_64.rpm 54 MB/s | 11 MB 00:00 (53/302): gettext-0.21-3.fc34.x86_64.rpm 12 MB/s | 1.1 MB 00:00 (54/302): gettext-libs-0.21-3.fc34.x86_64.rpm 11 MB/s | 308 kB 00:00 (55/302): git-2.29.2-3.fc34.x86_64.rpm 9.9 MB/s | 124 kB 00:00 (56/302): git-core-doc-2.29.2-3.fc34.noarch.rpm 25 MB/s | 2.2 MB 00:00 (57/302): git-core-2.29.2-3.fc34.x86_64.rpm 27 MB/s | 3.5 MB 00:00 (58/302): gl-manpages-1.1-21.20190306.fc33.noar 22 MB/s | 1.0 MB 00:00 (59/302): glib-networking-2.66.0-1.fc34.x86_64. 12 MB/s | 161 kB 00:00 (60/302): glib2-devel-2.67.0-6.fc34.x86_64.rpm 42 MB/s | 470 kB 00:00 (61/302): glibc-devel-2.32.9000-17.fc34.x86_64. 53 MB/s | 1.1 MB 00:00 (62/302): glibc-headers-x86-2.32.9000-17.fc34.n 41 MB/s | 499 kB 00:00 (63/302): glib2-2.67.0-6.fc34.x86_64.rpm 42 MB/s | 2.7 MB 00:00 (64/302): gnutls-3.6.15-2.fc34.x86_64.rpm 38 MB/s | 925 kB 00:00 (65/302): gcc-10.2.1-9.fc34.x86_64.rpm 51 MB/s | 30 MB 00:00 (66/302): graphene-1.10.2-5.fc34.x86_64.rpm 539 kB/s | 65 kB 00:00 (67/302): graphite2-1.3.14-6.fc34.x86_64.rpm 843 kB/s | 95 kB 00:00 (68/302): graphite2-devel-1.3.14-6.fc34.x86_64. 7.1 MB/s | 21 kB 00:00 (69/302): gsettings-desktop-schemas-3.38.0-1.fc 45 MB/s | 681 kB 00:00 (70/302): groff-base-1.22.4-4.fc34.x86_64.rpm 43 MB/s | 1.1 MB 00:00 (71/302): gtk-update-icon-cache-3.24.23-2.fc34. 3.2 MB/s | 33 kB 00:00 (72/302): gstreamer1-1.18.1-1.fc34.x86_64.rpm 23 MB/s | 1.4 MB 00:00 (73/302): gstreamer1-plugins-base-1.18.1-1.fc34 22 MB/s | 2.1 MB 00:00 (74/302): gtk3-3.24.23-2.fc34.x86_64.rpm 48 MB/s | 4.7 MB 00:00 (75/302): harfbuzz-2.7.2-1.fc34.x86_64.rpm 16 MB/s | 634 kB 00:00 (76/302): harfbuzz-devel-2.7.2-1.fc34.x86_64.rp 14 MB/s | 272 kB 00:00 (77/302): harfbuzz-icu-2.7.2-1.fc34.x86_64.rpm 2.6 MB/s | 15 kB 00:00 (78/302): hunspell-1.7.0-7.fc33.x86_64.rpm 13 MB/s | 329 kB 00:00 (79/302): hicolor-icon-theme-0.17-9.fc33.noarch 1.6 MB/s | 44 kB 00:00 (80/302): hunspell-en-US-0.20140811.1-17.fc33.n 11 MB/s | 176 kB 00:00 (81/302): hyphen-2.8.8-14.fc33.x86_64.rpm 8.0 MB/s | 29 kB 00:00 (82/302): iptables-libs-1.8.6-5.fc34.x86_64.rpm 40 MB/s | 367 kB 00:00 (83/302): isl-0.16.1-12.fc33.x86_64.rpm 52 MB/s | 876 kB 00:00 (84/302): gtk3-devel-3.24.23-2.fc34.x86_64.rpm 24 MB/s | 4.3 MB 00:00 (85/302): hwdata-0.342-1.fc34.noarch.rpm 18 MB/s | 1.4 MB 00:00 (86/302): jasper-libs-2.0.22-1.fc34.x86_64.rpm 11 MB/s | 152 kB 00:00 (87/302): jbigkit-libs-2.1-20.fc34.x86_64.rpm 13 MB/s | 52 kB 00:00 (88/302): json-c-0.14-7.fc33.x86_64.rpm 13 MB/s | 41 kB 00:00 (89/302): iso-codes-4.5.0-2.fc33.noarch.rpm 46 MB/s | 3.4 MB 00:00 (90/302): kernel-headers-5.10.0-0.rc6.git0.1.fc 31 MB/s | 1.2 MB 00:00 (91/302): json-glib-1.6.0-1.fc34.x86_64.rpm 3.5 MB/s | 150 kB 00:00 (92/302): kmod-libs-27-3.fc33.x86_64.rpm 8.3 MB/s | 63 kB 00:00 (93/302): langpacks-core-font-en-3.0-5.fc34.noa 1.9 MB/s | 9.7 kB 00:00 (94/302): less-551-4.fc33.x86_64.rpm 29 MB/s | 154 kB 00:00 (95/302): lcms2-2.11-2.fc33.x86_64.rpm 23 MB/s | 169 kB 00:00 (96/302): libSM-1.2.3-7.fc34.x86_64.rpm 9.3 MB/s | 42 kB 00:00 (97/302): libICE-1.0.10-5.fc34.x86_64.rpm 8.0 MB/s | 71 kB 00:00 (98/302): libX11-common-1.7.0-2.fc34.noarch.rpm 18 MB/s | 153 kB 00:00 (99/302): libX11-xcb-1.7.0-2.fc34.x86_64.rpm 5.4 MB/s | 11 kB 00:00 (100/302): libXau-1.0.9-5.fc34.x86_64.rpm 8.1 MB/s | 31 kB 00:00 (101/302): libXau-devel-1.0.9-5.fc34.x86_64.rpm 3.0 MB/s | 13 kB 00:00 (102/302): libXcomposite-0.4.5-4.fc34.x86_64.rp 8.7 MB/s | 23 kB 00:00 (103/302): libX11-devel-1.7.0-2.fc34.x86_64.rpm 28 MB/s | 940 kB 00:00 (104/302): libXcomposite-devel-0.4.5-4.fc34.x86 1.8 MB/s | 16 kB 00:00 (105/302): libXcursor-devel-1.2.0-4.fc34.x86_64 4.2 MB/s | 22 kB 00:00 (106/302): libXdamage-1.1.5-4.fc34.x86_64.rpm 9.1 MB/s | 22 kB 00:00 (107/302): libXcursor-1.2.0-4.fc34.x86_64.rpm 2.6 MB/s | 29 kB 00:00 (108/302): libXdamage-devel-1.1.5-4.fc34.x86_64 3.6 MB/s | 9.2 kB 00:00 (109/302): libXext-1.3.4-5.fc34.x86_64.rpm 11 MB/s | 39 kB 00:00 (110/302): libXext-devel-1.3.4-5.fc34.x86_64.rp 18 MB/s | 73 kB 00:00 (111/302): libXfixes-5.0.3-13.fc34.x86_64.rpm 4.5 MB/s | 19 kB 00:00 (112/302): libXfixes-devel-5.0.3-13.fc34.x86_64 3.0 MB/s | 12 kB 00:00 (113/302): libXft-2.3.3-5.fc34.x86_64.rpm 14 MB/s | 63 kB 00:00 (114/302): libXft-devel-2.3.3-5.fc34.x86_64.rpm 4.7 MB/s | 18 kB 00:00 (115/302): libXi-1.7.10-5.fc34.x86_64.rpm 11 MB/s | 38 kB 00:00 (116/302): libXi-devel-1.7.10-5.fc34.x86_64.rpm 17 MB/s | 100 kB 00:00 (117/302): libXinerama-1.1.4-7.fc34.x86_64.rpm 3.4 MB/s | 14 kB 00:00 (118/302): libXinerama-devel-1.1.4-7.fc34.x86_6 5.3 MB/s | 13 kB 00:00 (119/302): libXrandr-devel-1.5.2-5.fc34.x86_64. 5.9 MB/s | 19 kB 00:00 (120/302): libXrender-0.9.10-13.fc34.x86_64.rpm 8.2 MB/s | 27 kB 00:00 (121/302): libX11-1.7.0-2.fc34.x86_64.rpm 7.5 MB/s | 660 kB 00:00 (122/302): libXrender-devel-0.9.10-13.fc34.x86_ 2.8 MB/s | 16 kB 00:00 (123/302): libXtst-1.2.3-12.fc33.x86_64.rpm 5.7 MB/s | 20 kB 00:00 (124/302): libXtst-devel-1.2.3-12.fc33.x86_64.r 4.9 MB/s | 15 kB 00:00 (125/302): libXv-1.0.11-13.fc34.x86_64.rpm 4.4 MB/s | 18 kB 00:00 (126/302): libXxf86vm-1.1.4-15.fc34.x86_64.rpm 4.7 MB/s | 18 kB 00:00 (127/302): libargon2-20171227-5.fc33.x86_64.rpm 4.5 MB/s | 29 kB 00:00 (128/302): libblkid-devel-2.36.1-2.fc34.x86_64. 3.2 MB/s | 14 kB 00:00 (129/302): libcbor-0.7.0-2.fc34.x86_64.rpm 14 MB/s | 57 kB 00:00 (130/302): libappstream-glib-0.7.18-1.fc34.x86_ 20 MB/s | 397 kB 00:00 (131/302): libdatrie-0.2.9-13.fc34.x86_64.rpm 7.5 MB/s | 31 kB 00:00 (132/302): libXrandr-1.5.2-5.fc34.x86_64.rpm 559 kB/s | 27 kB 00:00 (133/302): libdrm-2.4.103-1.fc34.x86_64.rpm 16 MB/s | 160 kB 00:00 (134/302): libedit-3.1-33.20191231cvs.fc33.x86_ 14 MB/s | 106 kB 00:00 (135/302): libepoxy-1.5.4-3.fc33.x86_64.rpm 17 MB/s | 254 kB 00:00 (136/302): libdatrie-devel-0.2.9-13.fc34.x86_64 4.5 MB/s | 127 kB 00:00 (137/302): libepoxy-devel-1.5.4-3.fc33.x86_64.r 8.1 MB/s | 134 kB 00:00 (138/302): libffi-devel-3.1-26.fc33.x86_64.rpm 8.0 MB/s | 23 kB 00:00 (139/302): libevent-2.1.12-2.fc34.x86_64.rpm 28 MB/s | 265 kB 00:00 (140/302): libfido2-1.5.0-3.fc34.x86_64.rpm 8.9 MB/s | 69 kB 00:00 (141/302): libglvnd-1.3.2-2.fc33.x86_64.rpm 19 MB/s | 139 kB 00:00 (142/302): libglvnd-egl-1.3.2-2.fc33.x86_64.rpm 12 MB/s | 37 kB 00:00 (143/302): libglvnd-devel-1.3.2-2.fc33.x86_64.r 28 MB/s | 156 kB 00:00 (144/302): libglvnd-gles-1.3.2-2.fc33.x86_64.rp 4.3 MB/s | 33 kB 00:00 (145/302): libglvnd-glx-1.3.2-2.fc33.x86_64.rpm 20 MB/s | 155 kB 00:00 (146/302): libglvnd-opengl-1.3.2-2.fc33.x86_64. 12 MB/s | 44 kB 00:00 (147/302): libglvnd-core-devel-1.3.2-2.fc33.x86 919 kB/s | 18 kB 00:00 (148/302): libgusb-0.3.5-1.fc33.x86_64.rpm 11 MB/s | 50 kB 00:00 (149/302): libibverbs-core-32.0-1.fc34.x86_64.r 14 MB/s | 72 kB 00:00 (150/302): libjpeg-turbo-2.0.5-5.fc33.x86_64.rp 12 MB/s | 168 kB 00:00 (151/302): libmnl-1.0.4-12.fc33.x86_64.rpm 6.4 MB/s | 28 kB 00:00 (152/302): libmount-devel-2.36.1-2.fc34.x86_64. 5.3 MB/s | 15 kB 00:00 (153/302): libmpc-1.2.1-1.fc34.x86_64.rpm 13 MB/s | 63 kB 00:00 (154/302): libicu-devel-67.1-4.fc33.x86_64.rpm 18 MB/s | 831 kB 00:00 (155/302): libnetfilter_conntrack-1.0.7-5.fc33. 8.5 MB/s | 62 kB 00:00 (156/302): libnfnetlink-1.0.1-18.fc33.x86_64.rp 6.6 MB/s | 29 kB 00:00 (157/302): libmspack-0.10.1-0.4.alpha.fc33.x86_ 2.1 MB/s | 70 kB 00:00 (158/302): libnotify-0.7.9-3.fc33.x86_64.rpm 6.2 MB/s | 43 kB 00:00 (159/302): libnl3-3.5.0-5.fc33.x86_64.rpm 20 MB/s | 325 kB 00:00 (160/302): libogg-1.3.4-3.fc33.x86_64.rpm 9.7 MB/s | 33 kB 00:00 (161/302): libpciaccess-0.16-3.fc33.x86_64.rpm 7.8 MB/s | 26 kB 00:00 (162/302): libpcap-1.9.1-6.fc34.x86_64.rpm 25 MB/s | 173 kB 00:00 (163/302): libpng-1.6.37-6.fc34.x86_64.rpm 12 MB/s | 120 kB 00:00 (164/302): libproxy-0.4.15-29.fc34.x86_64.rpm 7.8 MB/s | 71 kB 00:00 (165/302): libseccomp-2.5.0-3.fc33.x86_64.rpm 13 MB/s | 72 kB 00:00 (166/302): libsecret-0.20.4-1.fc34.x86_64.rpm 13 MB/s | 162 kB 00:00 (167/302): libpng-devel-1.6.37-6.fc34.x86_64.rp 7.2 MB/s | 291 kB 00:00 (168/302): libselinux-devel-3.1-5.fc34.x86_64.r 22 MB/s | 113 kB 00:00 (169/302): libsepol-devel-3.1-5.fc34.x86_64.rpm 8.4 MB/s | 40 kB 00:00 (170/302): libsoup-2.72.0-3.fc34.x86_64.rpm 13 MB/s | 398 kB 00:00 (171/302): libicu-67.1-4.fc33.x86_64.rpm 50 MB/s | 9.7 MB 00:00 (172/302): libstdc++-devel-10.2.1-9.fc34.x86_64 28 MB/s | 2.0 MB 00:00 (173/302): libstemmer-0-15.585svn.fc33.x86_64.r 1.8 MB/s | 83 kB 00:00 (174/302): libthai-devel-0.1.28-5.fc33.x86_64.r 25 MB/s | 119 kB 00:00 (175/302): libtextstyle-0.21-3.fc34.x86_64.rpm 11 MB/s | 91 kB 00:00 (176/302): libtheora-1.1.1-28.fc33.x86_64.rpm 24 MB/s | 162 kB 00:00 (177/302): libthai-0.1.28-5.fc33.x86_64.rpm 13 MB/s | 213 kB 00:00 (178/302): libtiff-4.1.0-5.fc34.x86_64.rpm 18 MB/s | 185 kB 00:00 (179/302): libunwind-1.4.0-4.fc34.x86_64.rpm 7.4 MB/s | 65 kB 00:00 (180/302): libusbx-1.0.23-2.fc33.x86_64.rpm 8.5 MB/s | 70 kB 00:00 (181/302): libwayland-client-1.18.0-2.fc33.x86_ 9.2 MB/s | 32 kB 00:00 (182/302): libvorbis-1.3.7-2.fc33.x86_64.rpm 30 MB/s | 199 kB 00:00 (183/302): libvisual-0.4.0-29.fc33.x86_64.rpm 11 MB/s | 147 kB 00:00 (184/302): libwayland-egl-1.18.0-2.fc33.x86_64. 5.9 MB/s | 12 kB 00:00 (185/302): libwayland-server-1.18.0-2.fc33.x86_ 11 MB/s | 41 kB 00:00 (186/302): libwpe-1.8.0-1.fc34.x86_64.rpm 7.2 MB/s | 27 kB 00:00 (187/302): libwebp-1.1.0-5.fc33.x86_64.rpm 31 MB/s | 277 kB 00:00 (188/302): libxcb-1.13.1-6.fc34.x86_64.rpm 41 MB/s | 230 kB 00:00 (189/302): libxcrypt-devel-4.4.17-1.fc34.x86_64 11 MB/s | 32 kB 00:00 (190/302): libxkbcommon-1.0.3-1.fc34.x86_64.rpm 29 MB/s | 135 kB 00:00 (191/302): libxcb-devel-1.13.1-6.fc34.x86_64.rp 54 MB/s | 1.0 MB 00:00 (192/302): libxkbcommon-devel-1.0.3-1.fc34.x86_ 9.4 MB/s | 62 kB 00:00 (193/302): libwayland-cursor-1.18.0-2.fc33.x86_ 529 kB/s | 19 kB 00:00 (194/302): libxshmfence-1.3-7.fc33.x86_64.rpm 3.5 MB/s | 11 kB 00:00 (195/302): libxslt-1.1.34-4.fc34.x86_64.rpm 30 MB/s | 243 kB 00:00 (196/302): mesa-libEGL-20.3.0~rc3-2.fc34.x86_64 16 MB/s | 122 kB 00:00 (197/302): mesa-libEGL-devel-20.3.0~rc3-2.fc34. 4.8 MB/s | 18 kB 00:00 (198/302): mesa-libGL-20.3.0~rc3-2.fc34.x86_64. 29 MB/s | 182 kB 00:00 (199/302): libxml2-devel-2.9.10-9.fc34.x86_64.r 19 MB/s | 852 kB 00:00 (200/302): mesa-libGLU-devel-9.0.1-3.fc33.x86_6 1.2 MB/s | 12 kB 00:00 (201/302): mesa-libgbm-20.3.0~rc3-2.fc34.x86_64 10 MB/s | 42 kB 00:00 (202/302): mesa-libglapi-20.3.0~rc3-2.fc34.x86_ 11 MB/s | 59 kB 00:00 (203/302): mesa-libGLU-9.0.1-3.fc33.x86_64.rpm 3.9 MB/s | 148 kB 00:00 (204/302): nettle-3.6-3.fc33.x86_64.rpm 39 MB/s | 418 kB 00:00 (205/302): ncurses-6.2-3.20200222.fc33.x86_64.r 23 MB/s | 395 kB 00:00 (206/302): openal-soft-devel-1.19.1-9.fc34.x86_ 8.8 MB/s | 54 kB 00:00 (207/302): openal-soft-1.19.1-9.fc34.x86_64.rpm 35 MB/s | 543 kB 00:00 (208/302): openjpeg2-2.3.1-8.fc34.x86_64.rpm 23 MB/s | 154 kB 00:00 (209/302): openssh-8.4p1-4.fc34.x86_64.rpm 40 MB/s | 419 kB 00:00 (210/302): opus-1.3.1-7.fc34.x86_64.rpm 21 MB/s | 203 kB 00:00 (211/302): orc-0.4.31-3.fc33.x86_64.rpm 28 MB/s | 185 kB 00:00 (212/302): pango-1.48.0-1.fc34.x86_64.rpm 33 MB/s | 300 kB 00:00 (213/302): openssh-clients-8.4p1-4.fc34.x86_64. 15 MB/s | 613 kB 00:00 (214/302): pango-devel-1.48.0-1.fc34.x86_64.rpm 38 MB/s | 339 kB 00:00 (215/302): pcre-cpp-8.44-2.fc34.x86_64.rpm 5.0 MB/s | 26 kB 00:00 (216/302): pcre-devel-8.44-2.fc34.x86_64.rpm 41 MB/s | 471 kB 00:00 (217/302): pcre-utf16-8.44-2.fc34.x86_64.rpm 14 MB/s | 185 kB 00:00 (218/302): pcre-utf32-8.44-2.fc34.x86_64.rpm 26 MB/s | 175 kB 00:00 (219/302): pcre2-devel-10.36-0.1.RC1.fc34.x86_6 37 MB/s | 476 kB 00:00 (220/302): pcre2-utf16-10.36-0.1.RC1.fc34.x86_6 18 MB/s | 212 kB 00:00 (221/302): pcre2-utf32-10.36-0.1.RC1.fc34.x86_6 22 MB/s | 202 kB 00:00 (222/302): perl-Carp-1.50-457.fc33.noarch.rpm 3.2 MB/s | 29 kB 00:00 (223/302): perl-Class-Struct-0.66-467.fc34.noar 5.3 MB/s | 35 kB 00:00 (224/302): perl-DynaLoader-1.47-467.fc34.x86_64 9.2 MB/s | 41 kB 00:00 (225/302): perl-Errno-1.30-467.fc34.x86_64.rpm 8.8 MB/s | 27 kB 00:00 (226/302): perl-Error-0.17029-4.fc33.noarch.rpm 6.5 MB/s | 42 kB 00:00 (227/302): perl-Exporter-5.74-458.fc33.noarch.r 10 MB/s | 32 kB 00:00 (228/302): perl-Fcntl-1.13-467.fc34.x86_64.rpm 6.7 MB/s | 33 kB 00:00 (229/302): perl-Encode-3.07-457.fc33.x86_64.rpm 57 MB/s | 1.7 MB 00:00 (230/302): perl-File-Basename-2.85-467.fc34.noa 3.1 MB/s | 30 kB 00:00 (231/302): perl-File-Path-2.18-1.fc34.noarch.rp 9.5 MB/s | 36 kB 00:00 (232/302): perl-File-Temp-0.231.100-1.fc34.noar 14 MB/s | 60 kB 00:00 (233/302): perl-File-Find-1.37-467.fc34.noarch. 2.8 MB/s | 38 kB 00:00 (234/302): perl-File-stat-1.09-467.fc34.noarch. 7.7 MB/s | 30 kB 00:00 (235/302): perl-Getopt-Long-2.52-1.fc34.noarch. 14 MB/s | 60 kB 00:00 (236/302): perl-Getopt-Std-1.12-467.fc34.noarch 8.2 MB/s | 28 kB 00:00 (237/302): perl-Git-2.29.2-3.fc34.noarch.rpm 8.5 MB/s | 43 kB 00:00 (238/302): perl-HTTP-Tiny-0.076-457.fc33.noarch 11 MB/s | 55 kB 00:00 (239/302): perl-IO-1.43-467.fc34.x86_64.rpm 20 MB/s | 100 kB 00:00 (240/302): perl-IPC-Open3-1.21-467.fc34.noarch. 7.5 MB/s | 35 kB 00:00 (241/302): perl-MIME-Base64-3.16-1.fc34.x86_64. 6.9 MB/s | 30 kB 00:00 (242/302): perl-POSIX-1.94-467.fc34.x86_64.rpm 20 MB/s | 111 kB 00:00 (243/302): perl-PathTools-3.78-458.fc34.x86_64. 21 MB/s | 86 kB 00:00 (244/302): perl-Pod-Escapes-1.07-457.fc33.noarc 6.0 MB/s | 20 kB 00:00 (245/302): perl-Pod-Perldoc-3.28.01-458.fc33.no 18 MB/s | 84 kB 00:00 (246/302): perl-Pod-Usage-2.01-1.fc34.noarch.rp 13 MB/s | 41 kB 00:00 (247/302): perl-Pod-Simple-3.42-1.fc34.noarch.r 25 MB/s | 216 kB 00:00 (248/302): perl-Scalar-List-Utils-1.55-457.fc33 19 MB/s | 70 kB 00:00 (249/302): perl-SelectSaver-1.02-467.fc34.noarc 2.4 MB/s | 24 kB 00:00 (250/302): perl-Socket-2.030-2.fc33.x86_64.rpm 5.2 MB/s | 55 kB 00:00 (251/302): perl-Storable-3.21-457.fc33.x86_64.r 20 MB/s | 97 kB 00:00 (252/302): perl-Symbol-1.08-467.fc34.noarch.rpm 6.0 MB/s | 27 kB 00:00 (253/302): perl-Term-Cap-1.17-457.fc33.noarch.r 7.5 MB/s | 22 kB 00:00 (254/302): perl-TermReadKey-2.38-8.fc33.x86_64. 4.5 MB/s | 36 kB 00:00 (255/302): perl-Term-ANSIColor-5.01-458.fc33.no 3.2 MB/s | 49 kB 00:00 (256/302): perl-Text-ParseWords-3.30-457.fc33.n 4.4 MB/s | 16 kB 00:00 (257/302): perl-Text-Tabs+Wrap-2013.0523-457.fc 6.2 MB/s | 23 kB 00:00 (258/302): perl-Time-Local-1.300-4.fc33.noarch. 6.0 MB/s | 34 kB 00:00 (259/302): llvm-libs-11.0.0-2.fc34.x86_64.rpm 54 MB/s | 22 MB 00:00 (260/302): perl-constant-1.33-458.fc33.noarch.r 272 kB/s | 23 kB 00:00 (261/302): perl-if-0.60.800-467.fc34.noarch.rpm 325 kB/s | 26 kB 00:00 (262/302): perl-lib-0.65-467.fc34.x86_64.rpm 5.3 MB/s | 27 kB 00:00 (263/302): perl-interpreter-5.32.0-467.fc34.x86 11 MB/s | 84 kB 00:00 (264/302): perl-mro-1.23-467.fc34.x86_64.rpm 11 MB/s | 41 kB 00:00 (265/302): perl-overload-1.31-467.fc34.noarch.r 17 MB/s | 58 kB 00:00 (266/302): perl-overloading-0.02-467.fc34.noarc 5.3 MB/s | 25 kB 00:00 (267/302): perl-parent-0.238-457.fc33.noarch.rp 3.3 MB/s | 14 kB 00:00 (268/302): perl-podlators-4.14-457.fc33.noarch. 17 MB/s | 113 kB 00:00 (269/302): perl-subs-1.03-467.fc34.noarch.rpm 3.5 MB/s | 24 kB 00:00 (270/302): perl-vars-1.05-467.fc34.noarch.rpm 5.9 MB/s | 25 kB 00:00 (271/302): pixman-devel-0.40.0-2.fc33.x86_64.rp 4.6 MB/s | 17 kB 00:00 (272/302): pixman-0.40.0-2.fc33.x86_64.rpm 28 MB/s | 275 kB 00:00 (273/302): python-setuptools-wheel-50.3.2-1.fc3 61 MB/s | 471 kB 00:00 (274/302): python3-3.9.1~rc1-1.fc34.x86_64.rpm 9.3 MB/s | 28 kB 00:00 (275/302): perl-libs-5.32.0-467.fc34.x86_64.rpm 35 MB/s | 2.1 MB 00:00 (276/302): python-pip-wheel-20.2.4-1.fc34.noarc 34 MB/s | 1.3 MB 00:00 (277/302): rest-0.8.1-8.fc33.x86_64.rpm 6.4 MB/s | 69 kB 00:00 (278/302): shared-mime-info-2.0-5.fc34.x86_64.r 32 MB/s | 371 kB 00:00 (279/302): python3-libs-3.9.1~rc1-1.fc34.x86_64 67 MB/s | 7.4 MB 00:00 (280/302): systemd-247.1-1.fc34.x86_64.rpm 41 MB/s | 4.2 MB 00:00 (281/302): systemd-rpm-macros-247.1-1.fc34.noar 1.5 MB/s | 26 kB 00:00 (282/302): wayland-protocols-devel-1.20-2.fc33. 17 MB/s | 74 kB 00:00 (283/302): wayland-devel-1.18.0-2.fc33.x86_64.r 16 MB/s | 132 kB 00:00 (284/302): systemd-pam-247.1-1.fc34.x86_64.rpm 2.9 MB/s | 312 kB 00:00 (285/302): woff2-1.0.2-9.fc33.x86_64.rpm 16 MB/s | 60 kB 00:00 (286/302): wpebackend-fdo-1.8.0-1.fc34.x86_64.r 11 MB/s | 41 kB 00:00 (287/302): wxBase3-3.0.5.1-2.fc33.x86_64.rpm 22 MB/s | 979 kB 00:00 (288/302): wxBase3-devel-3.0.5.1-2.fc33.x86_64. 64 MB/s | 1.1 MB 00:00 (289/302): wxGTK3-3.0.5.1-2.fc33.x86_64.rpm 76 MB/s | 4.4 MB 00:00 (290/302): wxGTK3-devel-3.0.5.1-2.fc33.x86_64.r 2.3 MB/s | 32 kB 00:00 (291/302): wxGTK3-gl-3.0.5.1-2.fc33.x86_64.rpm 2.7 MB/s | 38 kB 00:00 (292/302): wxGTK3-i18n-3.0.5.1-2.fc33.noarch.rp 27 MB/s | 528 kB 00:00 (293/302): webkit2gtk3-jsc-2.30.3-1.fc34.x86_64 27 MB/s | 6.1 MB 00:00 (294/302): wxGTK3-media-3.0.5.1-2.fc33.x86_64.r 1.1 MB/s | 54 kB 00:00 (295/302): xdg-dbus-proxy-0.1.2-3.fc33.x86_64.r 2.7 MB/s | 43 kB 00:00 (296/302): wxGTK3-webview-3.0.5.1-2.fc33.x86_64 2.5 MB/s | 60 kB 00:00 (297/302): xkeyboard-config-2.31-3.fc34.noarch. 31 MB/s | 750 kB 00:00 (298/302): xml-common-0.6.3-55.fc33.noarch.rpm 1.5 MB/s | 31 kB 00:00 (299/302): xz-devel-5.2.5-3.fc33.x86_64.rpm 13 MB/s | 52 kB 00:00 (300/302): zlib-devel-1.2.11-23.fc34.x86_64.rpm 10 MB/s | 44 kB 00:00 (301/302): xorg-x11-proto-devel-2019.1-5.fc34.n 20 MB/s | 261 kB 00:00 (302/302): webkit2gtk3-2.30.3-1.fc34.x86_64.rpm 38 MB/s | 16 MB 00:00 -------------------------------------------------------------------------------- Total 74 MB/s | 212 MB 00:02 Running transaction check Transaction check succeeded. Running transaction test Transaction test succeeded. Running transaction Preparing : 1/1 Installing : shared-mime-info-2.0-5.fc34.x86_64 1/302 Running scriptlet: shared-mime-info-2.0-5.fc34.x86_64 1/302 Installing : glib2-2.67.0-6.fc34.x86_64 2/302 Installing : perl-Errno-1.30-467.fc34.x86_64 3/302 Installing : perl-Exporter-5.74-458.fc33.noarch 4/302 Installing : perl-Scalar-List-Utils-4:1.55-457.fc33.x86_64 5/302 Installing : perl-PathTools-3.78-458.fc34.x86_64 6/302 Installing : perl-constant-1.33-458.fc33.noarch 7/302 Installing : perl-libs-4:5.32.0-467.fc34.x86_64 8/302 Installing : perl-Carp-1.50-457.fc33.noarch 9/302 Installing : xorg-x11-proto-devel-2019.1-5.fc34.noarch 10/302 Installing : perl-vars-1.05-467.fc34.noarch 11/302 Installing : perl-Fcntl-1.13-467.fc34.x86_64 12/302 Installing : libpng-2:1.6.37-6.fc34.x86_64 13/302 Installing : freetype-2.10.4-1.fc34.x86_64 14/302 Installing : gdk-pixbuf2-2.40.0-3.fc33.x86_64 15/302 Installing : perl-File-Basename-2.85-467.fc34.noarch 16/302 Installing : libwayland-client-1.18.0-2.fc33.x86_64 17/302 Installing : perl-Symbol-1.08-467.fc34.noarch 18/302 Installing : wxBase3-3.0.5.1-2.fc33.x86_64 19/302 Installing : libjpeg-turbo-2.0.5-5.fc33.x86_64 20/302 Installing : perl-interpreter-4:5.32.0-467.fc34.x86_64 21/302 Installing : atk-2.36.0-2.fc33.x86_64 22/302 Installing : libwayland-server-1.18.0-2.fc33.x86_64 23/302 Installing : libwayland-egl-1.18.0-2.fc33.x86_64 24/302 Installing : libglvnd-1:1.3.2-2.fc33.x86_64 25/302 Installing : perl-parent-1:0.238-457.fc33.noarch 26/302 Installing : zlib-devel-1.2.11-23.fc34.x86_64 27/302 Installing : libicu-67.1-4.fc33.x86_64 28/302 Installing : libepoxy-1.5.4-3.fc33.x86_64 29/302 Installing : libX11-xcb-1.7.0-2.fc34.x86_64 30/302 Installing : dbus-libs-1:1.12.20-2.fc33.x86_64 31/302 Installing : libwayland-cursor-1.18.0-2.fc33.x86_64 32/302 Installing : perl-POSIX-1.94-467.fc34.x86_64 33/302 Running scriptlet: xml-common-0.6.3-55.fc33.noarch 34/302 Installing : xml-common-0.6.3-55.fc33.noarch 34/302 Installing : pixman-0.40.0-2.fc33.x86_64 35/302 Installing : libogg-2:1.3.4-3.fc33.x86_64 36/302 Installing : libmpc-1.2.1-1.fc34.x86_64 37/302 Installing : graphite2-1.3.14-6.fc34.x86_64 38/302 Installing : harfbuzz-2.7.2-1.fc34.x86_64 39/302 Installing : fribidi-1.0.10-3.fc33.x86_64 40/302 Installing : cmake-filesystem-3.18.4-3.fc34.x86_64 41/302 Installing : dbus-devel-1:1.12.20-2.fc33.x86_64 42/302 Installing : fribidi-devel-1.0.10-3.fc33.x86_64 43/302 Installing : harfbuzz-icu-2.7.2-1.fc34.x86_64 44/302 Installing : libpng-devel-2:1.6.37-6.fc34.x86_64 45/302 Installing : perl-Time-Local-2:1.300-4.fc33.noarch 46/302 Installing : perl-Socket-4:2.030-2.fc33.x86_64 47/302 Installing : perl-Text-ParseWords-3.30-457.fc33.noarch 48/302 Installing : perl-MIME-Base64-3.16-1.fc34.x86_64 49/302 Installing : json-glib-1.6.0-1.fc34.x86_64 50/302 Installing : hunspell-en-US-0.20140811.1-17.fc33.noarch 51/302 Installing : hunspell-1.7.0-7.fc33.x86_64 52/302 Installing : mesa-libglapi-20.3.0~rc3-2.fc34.x86_64 53/302 Installing : libxshmfence-1.3-7.fc33.x86_64 54/302 Installing : libtextstyle-0.21-3.fc34.x86_64 55/302 Installing : libseccomp-2.5.0-3.fc33.x86_64 56/302 Installing : libedit-3.1-33.20191231cvs.fc33.x86_64 57/302 Installing : libdatrie-0.2.9-13.fc34.x86_64 58/302 Installing : libthai-0.1.28-5.fc33.x86_64 59/302 Installing : libXau-1.0.9-5.fc34.x86_64 60/302 Installing : libxcb-1.13.1-6.fc34.x86_64 61/302 Installing : fonts-filesystem-1:2.0.5-4.fc33.noarch 62/302 Installing : dejavu-sans-fonts-2.37-15.fc34.noarch 63/302 Installing : alsa-lib-1.2.4-4.fc34.x86_64 64/302 Installing : SDL2-2.0.12-4.fc33.x86_64 65/302 Installing : langpacks-core-font-en-3.0-5.fc34.noarch 66/302 Installing : fontconfig-2.13.93-2.fc34.x86_64 67/302 Running scriptlet: fontconfig-2.13.93-2.fc34.x86_64 67/302 Installing : libXau-devel-1.0.9-5.fc34.x86_64 68/302 Installing : libxcb-devel-1.13.1-6.fc34.x86_64 69/302 Installing : libdatrie-devel-0.2.9-13.fc34.x86_64 70/302 Installing : libthai-devel-0.1.28-5.fc33.x86_64 71/302 Installing : llvm-libs-11.0.0-2.fc34.x86_64 72/302 Installing : gettext-libs-0.21-3.fc34.x86_64 73/302 Installing : gettext-0.21-3.fc34.x86_64 74/302 Installing : enchant2-2.2.13-1.fc34.x86_64 75/302 Installing : graphite2-devel-1.3.14-6.fc34.x86_64 76/302 Installing : cpp-10.2.1-9.fc34.x86_64 77/302 Installing : libtheora-1:1.1.1-28.fc33.x86_64 78/302 Installing : libvorbis-1:1.3.7-2.fc33.x86_64 79/302 Installing : pixman-devel-0.40.0-2.fc33.x86_64 80/302 Installing : iso-codes-4.5.0-2.fc33.noarch 81/302 Installing : wayland-devel-1.18.0-2.fc33.x86_64 82/302 Installing : libicu-devel-67.1-4.fc33.x86_64 83/302 Installing : webkit2gtk3-jsc-2.30.3-1.fc34.x86_64 84/302 Installing : libglvnd-opengl-1:1.3.2-2.fc33.x86_64 85/302 Installing : jasper-libs-2.0.22-1.fc34.x86_64 86/302 Installing : wxBase3-devel-3.0.5.1-2.fc33.x86_64 87/302 Running scriptlet: wxBase3-devel-3.0.5.1-2.fc33.x86_64 87/302 Installing : perl-SelectSaver-1.02-467.fc34.noarch 88/302 Installing : perl-File-Find-1.37-467.fc34.noarch 89/302 Installing : perl-File-Path-2.18-1.fc34.noarch 90/302 Installing : gtk-update-icon-cache-3.24.23-2.fc34.x86_64 91/302 Installing : libnotify-0.7.9-3.fc33.x86_64 92/302 Installing : perl-Pod-Escapes-1:1.07-457.fc33.noarch 93/302 Installing : perl-Text-Tabs+Wrap-2013.0523-457.fc33.noarch 94/302 Installing : perl-Class-Struct-0.66-467.fc34.noarch 95/302 Installing : perl-DynaLoader-1.47-467.fc34.x86_64 96/302 Installing : perl-TermReadKey-2.38-8.fc33.x86_64 97/302 Installing : perl-lib-0.65-467.fc34.x86_64 98/302 Installing : perl-overloading-0.02-467.fc34.noarch 99/302 Installing : perl-Getopt-Std-1.12-467.fc34.noarch 100/302 Installing : perl-Term-ANSIColor-5.01-458.fc33.noarch 101/302 Installing : perl-if-0.60.800-467.fc34.noarch 102/302 Installing : perl-mro-1.23-467.fc34.x86_64 103/302 Installing : perl-overload-1.31-467.fc34.noarch 104/302 Installing : perl-Error-1:0.17029-4.fc33.noarch 105/302 Installing : perl-File-stat-1.09-467.fc34.noarch 106/302 Installing : perl-IO-1.43-467.fc34.x86_64 107/302 Installing : perl-IPC-Open3-1.21-467.fc34.noarch 108/302 Installing : perl-File-Temp-1:0.231.100-1.fc34.noarch 109/302 Installing : perl-HTTP-Tiny-0.076-457.fc33.noarch 110/302 Installing : perl-Storable-1:3.21-457.fc33.x86_64 111/302 Installing : perl-subs-1.03-467.fc34.noarch 112/302 Installing : graphene-1.10.2-5.fc34.x86_64 113/302 Installing : gsettings-desktop-schemas-3.38.0-1.fc34.x86_64 114/302 Installing : libsecret-0.20.4-1.fc34.x86_64 115/302 Installing : xz-devel-5.2.5-3.fc33.x86_64 116/302 Installing : libxml2-devel-2.9.10-9.fc34.x86_64 117/302 Installing : xkeyboard-config-2.31-3.fc34.noarch 118/302 Installing : libxkbcommon-1.0.3-1.fc34.x86_64 119/302 Installing : libwpe-1.8.0-1.fc34.x86_64 120/302 Installing : wpebackend-fdo-1.8.0-1.fc34.x86_64 121/302 Installing : libxkbcommon-devel-1.0.3-1.fc34.x86_64 122/302 Installing : wxGTK3-i18n-3.0.5.1-2.fc33.noarch 123/302 Installing : woff2-1.0.2-9.fc33.x86_64 124/302 Installing : wayland-protocols-devel-1.20-2.fc33.noarch 125/302 Installing : systemd-rpm-macros-247.1-1.fc34.noarch 126/302 Installing : python-setuptools-wheel-50.3.2-1.fc34.noarch 127/302 Installing : python-pip-wheel-20.2.4-1.fc34.noarch 128/302 Installing : pcre2-utf32-10.36-0.1.RC1.fc34.x86_64 129/302 Installing : pcre2-utf16-10.36-0.1.RC1.fc34.x86_64 130/302 Installing : pcre2-devel-10.36-0.1.RC1.fc34.x86_64 131/302 Installing : pcre-utf32-8.44-2.fc34.x86_64 132/302 Installing : pcre-utf16-8.44-2.fc34.x86_64 133/302 Installing : pcre-cpp-8.44-2.fc34.x86_64 134/302 Installing : pcre-devel-8.44-2.fc34.x86_64 135/302 Installing : orc-0.4.31-3.fc33.x86_64 136/302 Installing : opus-1.3.1-7.fc34.x86_64 137/302 Running scriptlet: openssh-8.4p1-4.fc34.x86_64 138/302 Installing : openssh-8.4p1-4.fc34.x86_64 138/302 Installing : openjpeg2-2.3.1-8.fc34.x86_64 139/302 Installing : openal-soft-1.19.1-9.fc34.x86_64 140/302 Installing : nettle-3.6-3.fc33.x86_64 141/302 Installing : gnutls-3.6.15-2.fc34.x86_64 142/302 Installing : ncurses-6.2-3.20200222.fc33.x86_64 143/302 Installing : perl-Term-Cap-1.17-457.fc33.noarch 144/302 Installing : libxslt-1.1.34-4.fc34.x86_64 145/302 Installing : libwebp-1.1.0-5.fc33.x86_64 146/302 Installing : libvisual-1:0.4.0-29.fc33.x86_64 147/302 Installing : libusbx-1.0.23-2.fc33.x86_64 148/302 Installing : libgusb-0.3.5-1.fc33.x86_64 149/302 Installing : libunwind-1.4.0-4.fc34.x86_64 150/302 Installing : libstemmer-0-15.585svn.fc33.x86_64 151/302 Installing : libstdc++-devel-10.2.1-9.fc34.x86_64 152/302 Installing : libsepol-devel-3.1-5.fc34.x86_64 153/302 Installing : libselinux-devel-3.1-5.fc34.x86_64 154/302 Installing : libproxy-0.4.15-29.fc34.x86_64 155/302 Installing : glib-networking-2.66.0-1.fc34.x86_64 156/302 Installing : libsoup-2.72.0-3.fc34.x86_64 157/302 Installing : rest-0.8.1-8.fc33.x86_64 158/302 Installing : libnl3-3.5.0-5.fc33.x86_64 159/302 Installing : libibverbs-core-32.0-1.fc34.x86_64 160/302 Installing : libpcap-14:1.9.1-6.fc34.x86_64 161/302 Installing : libnfnetlink-1.0.1-18.fc33.x86_64 162/302 Installing : libmspack-0.10.1-0.4.alpha.fc33.x86_64 163/302 Installing : libmnl-1.0.4-12.fc33.x86_64 164/302 Installing : libnetfilter_conntrack-1.0.7-5.fc33.x86_64 165/302 Installing : iptables-libs-1.8.6-5.fc34.x86_64 166/302 Installing : libglvnd-core-devel-1:1.3.2-2.fc33.x86_64 167/302 Installing : libffi-devel-3.1-26.fc33.x86_64 168/302 Installing : libevent-2.1.12-2.fc34.x86_64 169/302 Installing : avahi-libs-0.8-6.fc34.x86_64 170/302 Installing : cups-libs-1:2.3.3-19.fc34.x86_64 171/302 Installing : libcbor-0.7.0-2.fc34.x86_64 172/302 Installing : libfido2-1.5.0-3.fc34.x86_64 173/302 Installing : openssh-clients-8.4p1-4.fc34.x86_64 174/302 Installing : libblkid-devel-2.36.1-2.fc34.x86_64 175/302 Installing : libmount-devel-2.36.1-2.fc34.x86_64 176/302 Installing : libargon2-20171227-5.fc33.x86_64 177/302 Installing : libX11-common-1.7.0-2.fc34.noarch 178/302 Installing : libX11-1.7.0-2.fc34.x86_64 179/302 Installing : libX11-devel-1.7.0-2.fc34.x86_64 180/302 Installing : libXext-1.3.4-5.fc34.x86_64 181/302 Installing : libXrender-0.9.10-13.fc34.x86_64 182/302 Installing : cairo-1.16.0-9.fc33.x86_64 183/302 Installing : libXext-devel-1.3.4-5.fc34.x86_64 184/302 Installing : libXrender-devel-0.9.10-13.fc34.x86_64 185/302 Installing : libXfixes-5.0.3-13.fc34.x86_64 186/302 Installing : libXfixes-devel-5.0.3-13.fc34.x86_64 187/302 Installing : libXdamage-1.1.5-4.fc34.x86_64 188/302 Installing : libXi-1.7.10-5.fc34.x86_64 189/302 Installing : libXi-devel-1.7.10-5.fc34.x86_64 190/302 Installing : libXcomposite-0.4.5-4.fc34.x86_64 191/302 Installing : libXtst-1.2.3-12.fc33.x86_64 192/302 Installing : libXcursor-1.2.0-4.fc34.x86_64 193/302 Installing : cairo-gobject-1.16.0-9.fc33.x86_64 194/302 Installing : libXft-2.3.3-5.fc34.x86_64 195/302 Installing : pango-1.48.0-1.fc34.x86_64 196/302 Installing : libXrandr-1.5.2-5.fc34.x86_64 197/302 Installing : libXinerama-1.1.4-7.fc34.x86_64 198/302 Installing : libXinerama-devel-1.1.4-7.fc34.x86_64 199/302 Installing : libXrandr-devel-1.5.2-5.fc34.x86_64 200/302 Installing : libXcursor-devel-1.2.0-4.fc34.x86_64 201/302 Installing : libXtst-devel-1.2.3-12.fc33.x86_64 202/302 Installing : libXcomposite-devel-0.4.5-4.fc34.x86_64 203/302 Installing : libXdamage-devel-1.1.5-4.fc34.x86_64 204/302 Installing : libXv-1.0.11-13.fc34.x86_64 205/302 Installing : libXxf86vm-1.1.4-15.fc34.x86_64 206/302 Installing : libICE-1.0.10-5.fc34.x86_64 207/302 Installing : libSM-1.2.3-7.fc34.x86_64 208/302 Installing : less-551-4.fc33.x86_64 209/302 Installing : git-core-2.29.2-3.fc34.x86_64 210/302 Installing : git-core-doc-2.29.2-3.fc34.noarch 211/302 Installing : lcms2-2.11-2.fc33.x86_64 212/302 Installing : colord-libs-1.4.5-1.fc34.x86_64 213/302 Installing : kmod-libs-27-3.fc33.x86_64 214/302 Installing : kernel-headers-5.10.0-0.rc6.git0.1.fc34.x86_64 215/302 Installing : json-c-0.14-7.fc33.x86_64 216/302 Installing : jbigkit-libs-2.1-20.fc34.x86_64 217/302 Installing : libtiff-4.1.0-5.fc34.x86_64 218/302 Installing : gdk-pixbuf2-modules-2.40.0-3.fc33.x86_64 219/302 Installing : isl-0.16.1-12.fc33.x86_64 220/302 Installing : hyphen-2.8.8-14.fc33.x86_64 221/302 Installing : hwdata-0.342-1.fc34.noarch 222/302 Installing : libpciaccess-0.16-3.fc33.x86_64 223/302 Installing : libdrm-2.4.103-1.fc34.x86_64 224/302 Installing : libglvnd-glx-1:1.3.2-2.fc33.x86_64 225/302 Installing : mesa-libGL-20.3.0~rc3-2.fc34.x86_64 226/302 Installing : mesa-libGLU-9.0.1-3.fc33.x86_64 227/302 Installing : mesa-libgbm-20.3.0~rc3-2.fc34.x86_64 228/302 Installing : libglvnd-egl-1:1.3.2-2.fc33.x86_64 229/302 Installing : mesa-libEGL-20.3.0~rc3-2.fc34.x86_64 230/302 Installing : libglvnd-gles-1:1.3.2-2.fc33.x86_64 231/302 Installing : libglvnd-devel-1:1.3.2-2.fc33.x86_64 232/302 Installing : libepoxy-devel-1.5.4-3.fc33.x86_64 233/302 Installing : mesa-libEGL-devel-20.3.0~rc3-2.fc34.x86_64 234/302 Installing : hicolor-icon-theme-0.17-9.fc33.noarch 235/302 Running scriptlet: groff-base-1.22.4-4.fc34.x86_64 236/302 Installing : groff-base-1.22.4-4.fc34.x86_64 236/302 Running scriptlet: groff-base-1.22.4-4.fc34.x86_64 236/302 Installing : perl-Encode-4:3.07-457.fc33.x86_64 237/302 Installing : perl-Pod-Simple-1:3.42-1.fc34.noarch 238/302 Installing : perl-Getopt-Long-1:2.52-1.fc34.noarch 239/302 Installing : perl-podlators-1:4.14-457.fc33.noarch 240/302 Installing : perl-Pod-Perldoc-3.28.01-458.fc33.noarch 241/302 Installing : perl-Pod-Usage-4:2.01-1.fc34.noarch 242/302 Installing : glibc-headers-x86-2.32.9000-17.fc34.noarch 243/302 Installing : libxcrypt-devel-4.4.17-1.fc34.x86_64 244/302 Installing : glibc-devel-2.32.9000-17.fc34.x86_64 245/302 Installing : gcc-10.2.1-9.fc34.x86_64 246/302 Installing : gl-manpages-1.1-21.20190306.fc33.noarch 247/302 Installing : mesa-libGLU-devel-9.0.1-3.fc33.x86_64 248/302 Installing : gdbm-libs-1:1.18.1-5.fc33.x86_64 249/302 Installing : python3-3.9.1~rc1-1.fc34.x86_64 250/302 Installing : python3-libs-3.9.1~rc1-1.fc34.x86_64 251/302 Installing : glib2-devel-2.67.0-6.fc34.x86_64 252/302 Installing : gstreamer1-1.18.1-1.fc34.x86_64 253/302 Installing : atk-devel-2.36.0-2.fc33.x86_64 254/302 Installing : gdk-pixbuf2-devel-2.40.0-3.fc33.x86_64 255/302 Installing : perl-Git-2.29.2-3.fc34.noarch 256/302 Installing : git-2.29.2-3.fc34.x86_64 257/302 Installing : emacs-filesystem-1:27.1-2.fc34.noarch 258/302 Installing : cdparanoia-libs-10.2-35.fc34.x86_64 259/302 Installing : gstreamer1-plugins-base-1.18.1-1.fc34.x86_64 260/302 Installing : bzip2-devel-1.0.8-4.fc33.x86_64 261/302 Installing : bubblewrap-0.4.1-2.fc33.x86_64 262/302 Installing : brotli-1.0.9-3.fc34.x86_64 263/302 Installing : brotli-devel-1.0.9-3.fc34.x86_64 264/302 Installing : freetype-devel-2.10.4-1.fc34.x86_64 265/302 Installing : fontconfig-devel-2.13.93-2.fc34.x86_64 266/302 Installing : cairo-devel-1.16.0-9.fc33.x86_64 267/302 Installing : cairo-gobject-devel-1.16.0-9.fc33.x86_64 268/302 Installing : libXft-devel-2.3.3-5.fc34.x86_64 269/302 Installing : harfbuzz-devel-2.7.2-1.fc34.x86_64 270/302 Installing : pango-devel-1.48.0-1.fc34.x86_64 271/302 Installing : adwaita-cursor-theme-3.38.0-1.fc34.noarch 272/302 Installing : adwaita-icon-theme-3.38.0-1.fc34.noarch 273/302 Installing : acl-2.2.53-9.fc34.x86_64 274/302 Installing : device-mapper-1.02.173-1.fc33.x86_64 275/302 Installing : device-mapper-libs-1.02.173-1.fc33.x86_64 276/302 Installing : cryptsetup-libs-2.3.4-1.fc34.x86_64 277/302 Installing : dbus-1:1.12.20-2.fc33.x86_64 278/302 Installing : systemd-pam-247.1-1.fc34.x86_64 279/302 Running scriptlet: systemd-247.1-1.fc34.x86_64 280/302 Installing : systemd-247.1-1.fc34.x86_64 280/302 Running scriptlet: systemd-247.1-1.fc34.x86_64 280/302 Installing : dbus-common-1:1.12.20-2.fc33.noarch 281/302 Running scriptlet: dbus-common-1:1.12.20-2.fc33.noarch 281/302 Created symlink /etc/systemd/system/sockets.target.wants/dbus.socket → /usr/lib/systemd/system/dbus.socket. Created symlink /etc/systemd/user/sockets.target.wants/dbus.socket → /usr/lib/systemd/user/dbus.socket. Running scriptlet: dbus-broker-24-1.fc34.x86_64 282/302 Installing : dbus-broker-24-1.fc34.x86_64 282/302 Running scriptlet: dbus-broker-24-1.fc34.x86_64 282/302 Created symlink /etc/systemd/system/dbus.service → /usr/lib/systemd/system/dbus-broker.service. Created symlink /etc/systemd/user/dbus.service → /usr/lib/systemd/user/dbus-broker.service. Installing : at-spi2-core-2.38.0-2.fc34.x86_64 283/302 Installing : at-spi2-atk-2.38.0-1.fc34.x86_64 284/302 Installing : gtk3-3.24.23-2.fc34.x86_64 285/302 Installing : wxGTK3-3.0.5.1-2.fc33.x86_64 286/302 Installing : wxGTK3-gl-3.0.5.1-2.fc33.x86_64 287/302 Installing : wxGTK3-media-3.0.5.1-2.fc33.x86_64 288/302 Installing : at-spi2-core-devel-2.38.0-2.fc34.x86_64 289/302 Installing : at-spi2-atk-devel-2.38.0-1.fc34.x86_64 290/302 Installing : gtk3-devel-3.24.23-2.fc34.x86_64 291/302 Installing : xdg-dbus-proxy-0.1.2-3.fc33.x86_64 292/302 Installing : webkit2gtk3-2.30.3-1.fc34.x86_64 293/302 Installing : wxGTK3-webview-3.0.5.1-2.fc33.x86_64 294/302 Installing : wxGTK3-devel-3.0.5.1-2.fc33.x86_64 295/302 Installing : desktop-file-utils-0.26-2.fc33.x86_64 296/302 Installing : annobin-9.47-1.fc34.x86_64 297/302 Installing : gcc-c++-10.2.1-9.fc34.x86_64 298/302 Installing : SDL2-devel-2.0.12-4.fc33.x86_64 299/302 Installing : libappstream-glib-0.7.18-1.fc34.x86_64 300/302 Installing : openal-soft-devel-1.19.1-9.fc34.x86_64 301/302 Installing : alsa-lib-devel-1.2.4-4.fc34.x86_64 302/302 Running scriptlet: fontconfig-2.13.93-2.fc34.x86_64 302/302 Running scriptlet: alsa-lib-devel-1.2.4-4.fc34.x86_64 302/302 Verifying : SDL2-2.0.12-4.fc33.x86_64 1/302 Verifying : SDL2-devel-2.0.12-4.fc33.x86_64 2/302 Verifying : acl-2.2.53-9.fc34.x86_64 3/302 Verifying : adwaita-cursor-theme-3.38.0-1.fc34.noarch 4/302 Verifying : adwaita-icon-theme-3.38.0-1.fc34.noarch 5/302 Verifying : alsa-lib-1.2.4-4.fc34.x86_64 6/302 Verifying : alsa-lib-devel-1.2.4-4.fc34.x86_64 7/302 Verifying : annobin-9.47-1.fc34.x86_64 8/302 Verifying : at-spi2-atk-2.38.0-1.fc34.x86_64 9/302 Verifying : at-spi2-atk-devel-2.38.0-1.fc34.x86_64 10/302 Verifying : at-spi2-core-2.38.0-2.fc34.x86_64 11/302 Verifying : at-spi2-core-devel-2.38.0-2.fc34.x86_64 12/302 Verifying : atk-2.36.0-2.fc33.x86_64 13/302 Verifying : atk-devel-2.36.0-2.fc33.x86_64 14/302 Verifying : avahi-libs-0.8-6.fc34.x86_64 15/302 Verifying : brotli-1.0.9-3.fc34.x86_64 16/302 Verifying : brotli-devel-1.0.9-3.fc34.x86_64 17/302 Verifying : bubblewrap-0.4.1-2.fc33.x86_64 18/302 Verifying : bzip2-devel-1.0.8-4.fc33.x86_64 19/302 Verifying : cairo-1.16.0-9.fc33.x86_64 20/302 Verifying : cairo-devel-1.16.0-9.fc33.x86_64 21/302 Verifying : cairo-gobject-1.16.0-9.fc33.x86_64 22/302 Verifying : cairo-gobject-devel-1.16.0-9.fc33.x86_64 23/302 Verifying : cdparanoia-libs-10.2-35.fc34.x86_64 24/302 Verifying : cmake-filesystem-3.18.4-3.fc34.x86_64 25/302 Verifying : colord-libs-1.4.5-1.fc34.x86_64 26/302 Verifying : cpp-10.2.1-9.fc34.x86_64 27/302 Verifying : cryptsetup-libs-2.3.4-1.fc34.x86_64 28/302 Verifying : cups-libs-1:2.3.3-19.fc34.x86_64 29/302 Verifying : dbus-1:1.12.20-2.fc33.x86_64 30/302 Verifying : dbus-broker-24-1.fc34.x86_64 31/302 Verifying : dbus-common-1:1.12.20-2.fc33.noarch 32/302 Verifying : dbus-devel-1:1.12.20-2.fc33.x86_64 33/302 Verifying : dbus-libs-1:1.12.20-2.fc33.x86_64 34/302 Verifying : dejavu-sans-fonts-2.37-15.fc34.noarch 35/302 Verifying : desktop-file-utils-0.26-2.fc33.x86_64 36/302 Verifying : device-mapper-1.02.173-1.fc33.x86_64 37/302 Verifying : device-mapper-libs-1.02.173-1.fc33.x86_64 38/302 Verifying : emacs-filesystem-1:27.1-2.fc34.noarch 39/302 Verifying : enchant2-2.2.13-1.fc34.x86_64 40/302 Verifying : fontconfig-2.13.93-2.fc34.x86_64 41/302 Verifying : fontconfig-devel-2.13.93-2.fc34.x86_64 42/302 Verifying : fonts-filesystem-1:2.0.5-4.fc33.noarch 43/302 Verifying : freetype-2.10.4-1.fc34.x86_64 44/302 Verifying : freetype-devel-2.10.4-1.fc34.x86_64 45/302 Verifying : fribidi-1.0.10-3.fc33.x86_64 46/302 Verifying : fribidi-devel-1.0.10-3.fc33.x86_64 47/302 Verifying : gcc-10.2.1-9.fc34.x86_64 48/302 Verifying : gcc-c++-10.2.1-9.fc34.x86_64 49/302 Verifying : gdbm-libs-1:1.18.1-5.fc33.x86_64 50/302 Verifying : gdk-pixbuf2-2.40.0-3.fc33.x86_64 51/302 Verifying : gdk-pixbuf2-devel-2.40.0-3.fc33.x86_64 52/302 Verifying : gdk-pixbuf2-modules-2.40.0-3.fc33.x86_64 53/302 Verifying : gettext-0.21-3.fc34.x86_64 54/302 Verifying : gettext-libs-0.21-3.fc34.x86_64 55/302 Verifying : git-2.29.2-3.fc34.x86_64 56/302 Verifying : git-core-2.29.2-3.fc34.x86_64 57/302 Verifying : git-core-doc-2.29.2-3.fc34.noarch 58/302 Verifying : gl-manpages-1.1-21.20190306.fc33.noarch 59/302 Verifying : glib-networking-2.66.0-1.fc34.x86_64 60/302 Verifying : glib2-2.67.0-6.fc34.x86_64 61/302 Verifying : glib2-devel-2.67.0-6.fc34.x86_64 62/302 Verifying : glibc-devel-2.32.9000-17.fc34.x86_64 63/302 Verifying : glibc-headers-x86-2.32.9000-17.fc34.noarch 64/302 Verifying : gnutls-3.6.15-2.fc34.x86_64 65/302 Verifying : graphene-1.10.2-5.fc34.x86_64 66/302 Verifying : graphite2-1.3.14-6.fc34.x86_64 67/302 Verifying : graphite2-devel-1.3.14-6.fc34.x86_64 68/302 Verifying : groff-base-1.22.4-4.fc34.x86_64 69/302 Verifying : gsettings-desktop-schemas-3.38.0-1.fc34.x86_64 70/302 Verifying : gstreamer1-1.18.1-1.fc34.x86_64 71/302 Verifying : gstreamer1-plugins-base-1.18.1-1.fc34.x86_64 72/302 Verifying : gtk-update-icon-cache-3.24.23-2.fc34.x86_64 73/302 Verifying : gtk3-3.24.23-2.fc34.x86_64 74/302 Verifying : gtk3-devel-3.24.23-2.fc34.x86_64 75/302 Verifying : harfbuzz-2.7.2-1.fc34.x86_64 76/302 Verifying : harfbuzz-devel-2.7.2-1.fc34.x86_64 77/302 Verifying : harfbuzz-icu-2.7.2-1.fc34.x86_64 78/302 Verifying : hicolor-icon-theme-0.17-9.fc33.noarch 79/302 Verifying : hunspell-1.7.0-7.fc33.x86_64 80/302 Verifying : hunspell-en-US-0.20140811.1-17.fc33.noarch 81/302 Verifying : hwdata-0.342-1.fc34.noarch 82/302 Verifying : hyphen-2.8.8-14.fc33.x86_64 83/302 Verifying : iptables-libs-1.8.6-5.fc34.x86_64 84/302 Verifying : isl-0.16.1-12.fc33.x86_64 85/302 Verifying : iso-codes-4.5.0-2.fc33.noarch 86/302 Verifying : jasper-libs-2.0.22-1.fc34.x86_64 87/302 Verifying : jbigkit-libs-2.1-20.fc34.x86_64 88/302 Verifying : json-c-0.14-7.fc33.x86_64 89/302 Verifying : json-glib-1.6.0-1.fc34.x86_64 90/302 Verifying : kernel-headers-5.10.0-0.rc6.git0.1.fc34.x86_64 91/302 Verifying : kmod-libs-27-3.fc33.x86_64 92/302 Verifying : langpacks-core-font-en-3.0-5.fc34.noarch 93/302 Verifying : lcms2-2.11-2.fc33.x86_64 94/302 Verifying : less-551-4.fc33.x86_64 95/302 Verifying : libICE-1.0.10-5.fc34.x86_64 96/302 Verifying : libSM-1.2.3-7.fc34.x86_64 97/302 Verifying : libX11-1.7.0-2.fc34.x86_64 98/302 Verifying : libX11-common-1.7.0-2.fc34.noarch 99/302 Verifying : libX11-devel-1.7.0-2.fc34.x86_64 100/302 Verifying : libX11-xcb-1.7.0-2.fc34.x86_64 101/302 Verifying : libXau-1.0.9-5.fc34.x86_64 102/302 Verifying : libXau-devel-1.0.9-5.fc34.x86_64 103/302 Verifying : libXcomposite-0.4.5-4.fc34.x86_64 104/302 Verifying : libXcomposite-devel-0.4.5-4.fc34.x86_64 105/302 Verifying : libXcursor-1.2.0-4.fc34.x86_64 106/302 Verifying : libXcursor-devel-1.2.0-4.fc34.x86_64 107/302 Verifying : libXdamage-1.1.5-4.fc34.x86_64 108/302 Verifying : libXdamage-devel-1.1.5-4.fc34.x86_64 109/302 Verifying : libXext-1.3.4-5.fc34.x86_64 110/302 Verifying : libXext-devel-1.3.4-5.fc34.x86_64 111/302 Verifying : libXfixes-5.0.3-13.fc34.x86_64 112/302 Verifying : libXfixes-devel-5.0.3-13.fc34.x86_64 113/302 Verifying : libXft-2.3.3-5.fc34.x86_64 114/302 Verifying : libXft-devel-2.3.3-5.fc34.x86_64 115/302 Verifying : libXi-1.7.10-5.fc34.x86_64 116/302 Verifying : libXi-devel-1.7.10-5.fc34.x86_64 117/302 Verifying : libXinerama-1.1.4-7.fc34.x86_64 118/302 Verifying : libXinerama-devel-1.1.4-7.fc34.x86_64 119/302 Verifying : libXrandr-1.5.2-5.fc34.x86_64 120/302 Verifying : libXrandr-devel-1.5.2-5.fc34.x86_64 121/302 Verifying : libXrender-0.9.10-13.fc34.x86_64 122/302 Verifying : libXrender-devel-0.9.10-13.fc34.x86_64 123/302 Verifying : libXtst-1.2.3-12.fc33.x86_64 124/302 Verifying : libXtst-devel-1.2.3-12.fc33.x86_64 125/302 Verifying : libXv-1.0.11-13.fc34.x86_64 126/302 Verifying : libXxf86vm-1.1.4-15.fc34.x86_64 127/302 Verifying : libappstream-glib-0.7.18-1.fc34.x86_64 128/302 Verifying : libargon2-20171227-5.fc33.x86_64 129/302 Verifying : libblkid-devel-2.36.1-2.fc34.x86_64 130/302 Verifying : libcbor-0.7.0-2.fc34.x86_64 131/302 Verifying : libdatrie-0.2.9-13.fc34.x86_64 132/302 Verifying : libdatrie-devel-0.2.9-13.fc34.x86_64 133/302 Verifying : libdrm-2.4.103-1.fc34.x86_64 134/302 Verifying : libedit-3.1-33.20191231cvs.fc33.x86_64 135/302 Verifying : libepoxy-1.5.4-3.fc33.x86_64 136/302 Verifying : libepoxy-devel-1.5.4-3.fc33.x86_64 137/302 Verifying : libevent-2.1.12-2.fc34.x86_64 138/302 Verifying : libffi-devel-3.1-26.fc33.x86_64 139/302 Verifying : libfido2-1.5.0-3.fc34.x86_64 140/302 Verifying : libglvnd-1:1.3.2-2.fc33.x86_64 141/302 Verifying : libglvnd-core-devel-1:1.3.2-2.fc33.x86_64 142/302 Verifying : libglvnd-devel-1:1.3.2-2.fc33.x86_64 143/302 Verifying : libglvnd-egl-1:1.3.2-2.fc33.x86_64 144/302 Verifying : libglvnd-gles-1:1.3.2-2.fc33.x86_64 145/302 Verifying : libglvnd-glx-1:1.3.2-2.fc33.x86_64 146/302 Verifying : libglvnd-opengl-1:1.3.2-2.fc33.x86_64 147/302 Verifying : libgusb-0.3.5-1.fc33.x86_64 148/302 Verifying : libibverbs-core-32.0-1.fc34.x86_64 149/302 Verifying : libicu-67.1-4.fc33.x86_64 150/302 Verifying : libicu-devel-67.1-4.fc33.x86_64 151/302 Verifying : libjpeg-turbo-2.0.5-5.fc33.x86_64 152/302 Verifying : libmnl-1.0.4-12.fc33.x86_64 153/302 Verifying : libmount-devel-2.36.1-2.fc34.x86_64 154/302 Verifying : libmpc-1.2.1-1.fc34.x86_64 155/302 Verifying : libmspack-0.10.1-0.4.alpha.fc33.x86_64 156/302 Verifying : libnetfilter_conntrack-1.0.7-5.fc33.x86_64 157/302 Verifying : libnfnetlink-1.0.1-18.fc33.x86_64 158/302 Verifying : libnl3-3.5.0-5.fc33.x86_64 159/302 Verifying : libnotify-0.7.9-3.fc33.x86_64 160/302 Verifying : libogg-2:1.3.4-3.fc33.x86_64 161/302 Verifying : libpcap-14:1.9.1-6.fc34.x86_64 162/302 Verifying : libpciaccess-0.16-3.fc33.x86_64 163/302 Verifying : libpng-2:1.6.37-6.fc34.x86_64 164/302 Verifying : libpng-devel-2:1.6.37-6.fc34.x86_64 165/302 Verifying : libproxy-0.4.15-29.fc34.x86_64 166/302 Verifying : libseccomp-2.5.0-3.fc33.x86_64 167/302 Verifying : libsecret-0.20.4-1.fc34.x86_64 168/302 Verifying : libselinux-devel-3.1-5.fc34.x86_64 169/302 Verifying : libsepol-devel-3.1-5.fc34.x86_64 170/302 Verifying : libsoup-2.72.0-3.fc34.x86_64 171/302 Verifying : libstdc++-devel-10.2.1-9.fc34.x86_64 172/302 Verifying : libstemmer-0-15.585svn.fc33.x86_64 173/302 Verifying : libtextstyle-0.21-3.fc34.x86_64 174/302 Verifying : libthai-0.1.28-5.fc33.x86_64 175/302 Verifying : libthai-devel-0.1.28-5.fc33.x86_64 176/302 Verifying : libtheora-1:1.1.1-28.fc33.x86_64 177/302 Verifying : libtiff-4.1.0-5.fc34.x86_64 178/302 Verifying : libunwind-1.4.0-4.fc34.x86_64 179/302 Verifying : libusbx-1.0.23-2.fc33.x86_64 180/302 Verifying : libvisual-1:0.4.0-29.fc33.x86_64 181/302 Verifying : libvorbis-1:1.3.7-2.fc33.x86_64 182/302 Verifying : libwayland-client-1.18.0-2.fc33.x86_64 183/302 Verifying : libwayland-cursor-1.18.0-2.fc33.x86_64 184/302 Verifying : libwayland-egl-1.18.0-2.fc33.x86_64 185/302 Verifying : libwayland-server-1.18.0-2.fc33.x86_64 186/302 Verifying : libwebp-1.1.0-5.fc33.x86_64 187/302 Verifying : libwpe-1.8.0-1.fc34.x86_64 188/302 Verifying : libxcb-1.13.1-6.fc34.x86_64 189/302 Verifying : libxcb-devel-1.13.1-6.fc34.x86_64 190/302 Verifying : libxcrypt-devel-4.4.17-1.fc34.x86_64 191/302 Verifying : libxkbcommon-1.0.3-1.fc34.x86_64 192/302 Verifying : libxkbcommon-devel-1.0.3-1.fc34.x86_64 193/302 Verifying : libxml2-devel-2.9.10-9.fc34.x86_64 194/302 Verifying : libxshmfence-1.3-7.fc33.x86_64 195/302 Verifying : libxslt-1.1.34-4.fc34.x86_64 196/302 Verifying : llvm-libs-11.0.0-2.fc34.x86_64 197/302 Verifying : mesa-libEGL-20.3.0~rc3-2.fc34.x86_64 198/302 Verifying : mesa-libEGL-devel-20.3.0~rc3-2.fc34.x86_64 199/302 Verifying : mesa-libGL-20.3.0~rc3-2.fc34.x86_64 200/302 Verifying : mesa-libGLU-9.0.1-3.fc33.x86_64 201/302 Verifying : mesa-libGLU-devel-9.0.1-3.fc33.x86_64 202/302 Verifying : mesa-libgbm-20.3.0~rc3-2.fc34.x86_64 203/302 Verifying : mesa-libglapi-20.3.0~rc3-2.fc34.x86_64 204/302 Verifying : ncurses-6.2-3.20200222.fc33.x86_64 205/302 Verifying : nettle-3.6-3.fc33.x86_64 206/302 Verifying : openal-soft-1.19.1-9.fc34.x86_64 207/302 Verifying : openal-soft-devel-1.19.1-9.fc34.x86_64 208/302 Verifying : openjpeg2-2.3.1-8.fc34.x86_64 209/302 Verifying : openssh-8.4p1-4.fc34.x86_64 210/302 Verifying : openssh-clients-8.4p1-4.fc34.x86_64 211/302 Verifying : opus-1.3.1-7.fc34.x86_64 212/302 Verifying : orc-0.4.31-3.fc33.x86_64 213/302 Verifying : pango-1.48.0-1.fc34.x86_64 214/302 Verifying : pango-devel-1.48.0-1.fc34.x86_64 215/302 Verifying : pcre-cpp-8.44-2.fc34.x86_64 216/302 Verifying : pcre-devel-8.44-2.fc34.x86_64 217/302 Verifying : pcre-utf16-8.44-2.fc34.x86_64 218/302 Verifying : pcre-utf32-8.44-2.fc34.x86_64 219/302 Verifying : pcre2-devel-10.36-0.1.RC1.fc34.x86_64 220/302 Verifying : pcre2-utf16-10.36-0.1.RC1.fc34.x86_64 221/302 Verifying : pcre2-utf32-10.36-0.1.RC1.fc34.x86_64 222/302 Verifying : perl-Carp-1.50-457.fc33.noarch 223/302 Verifying : perl-Class-Struct-0.66-467.fc34.noarch 224/302 Verifying : perl-DynaLoader-1.47-467.fc34.x86_64 225/302 Verifying : perl-Encode-4:3.07-457.fc33.x86_64 226/302 Verifying : perl-Errno-1.30-467.fc34.x86_64 227/302 Verifying : perl-Error-1:0.17029-4.fc33.noarch 228/302 Verifying : perl-Exporter-5.74-458.fc33.noarch 229/302 Verifying : perl-Fcntl-1.13-467.fc34.x86_64 230/302 Verifying : perl-File-Basename-2.85-467.fc34.noarch 231/302 Verifying : perl-File-Find-1.37-467.fc34.noarch 232/302 Verifying : perl-File-Path-2.18-1.fc34.noarch 233/302 Verifying : perl-File-Temp-1:0.231.100-1.fc34.noarch 234/302 Verifying : perl-File-stat-1.09-467.fc34.noarch 235/302 Verifying : perl-Getopt-Long-1:2.52-1.fc34.noarch 236/302 Verifying : perl-Getopt-Std-1.12-467.fc34.noarch 237/302 Verifying : perl-Git-2.29.2-3.fc34.noarch 238/302 Verifying : perl-HTTP-Tiny-0.076-457.fc33.noarch 239/302 Verifying : perl-IO-1.43-467.fc34.x86_64 240/302 Verifying : perl-IPC-Open3-1.21-467.fc34.noarch 241/302 Verifying : perl-MIME-Base64-3.16-1.fc34.x86_64 242/302 Verifying : perl-POSIX-1.94-467.fc34.x86_64 243/302 Verifying : perl-PathTools-3.78-458.fc34.x86_64 244/302 Verifying : perl-Pod-Escapes-1:1.07-457.fc33.noarch 245/302 Verifying : perl-Pod-Perldoc-3.28.01-458.fc33.noarch 246/302 Verifying : perl-Pod-Simple-1:3.42-1.fc34.noarch 247/302 Verifying : perl-Pod-Usage-4:2.01-1.fc34.noarch 248/302 Verifying : perl-Scalar-List-Utils-4:1.55-457.fc33.x86_64 249/302 Verifying : perl-SelectSaver-1.02-467.fc34.noarch 250/302 Verifying : perl-Socket-4:2.030-2.fc33.x86_64 251/302 Verifying : perl-Storable-1:3.21-457.fc33.x86_64 252/302 Verifying : perl-Symbol-1.08-467.fc34.noarch 253/302 Verifying : perl-Term-ANSIColor-5.01-458.fc33.noarch 254/302 Verifying : perl-Term-Cap-1.17-457.fc33.noarch 255/302 Verifying : perl-TermReadKey-2.38-8.fc33.x86_64 256/302 Verifying : perl-Text-ParseWords-3.30-457.fc33.noarch 257/302 Verifying : perl-Text-Tabs+Wrap-2013.0523-457.fc33.noarch 258/302 Verifying : perl-Time-Local-2:1.300-4.fc33.noarch 259/302 Verifying : perl-constant-1.33-458.fc33.noarch 260/302 Verifying : perl-if-0.60.800-467.fc34.noarch 261/302 Verifying : perl-interpreter-4:5.32.0-467.fc34.x86_64 262/302 Verifying : perl-lib-0.65-467.fc34.x86_64 263/302 Verifying : perl-libs-4:5.32.0-467.fc34.x86_64 264/302 Verifying : perl-mro-1.23-467.fc34.x86_64 265/302 Verifying : perl-overload-1.31-467.fc34.noarch 266/302 Verifying : perl-overloading-0.02-467.fc34.noarch 267/302 Verifying : perl-parent-1:0.238-457.fc33.noarch 268/302 Verifying : perl-podlators-1:4.14-457.fc33.noarch 269/302 Verifying : perl-subs-1.03-467.fc34.noarch 270/302 Verifying : perl-vars-1.05-467.fc34.noarch 271/302 Verifying : pixman-0.40.0-2.fc33.x86_64 272/302 Verifying : pixman-devel-0.40.0-2.fc33.x86_64 273/302 Verifying : python-pip-wheel-20.2.4-1.fc34.noarch 274/302 Verifying : python-setuptools-wheel-50.3.2-1.fc34.noarch 275/302 Verifying : python3-3.9.1~rc1-1.fc34.x86_64 276/302 Verifying : python3-libs-3.9.1~rc1-1.fc34.x86_64 277/302 Verifying : rest-0.8.1-8.fc33.x86_64 278/302 Verifying : shared-mime-info-2.0-5.fc34.x86_64 279/302 Verifying : systemd-247.1-1.fc34.x86_64 280/302 Verifying : systemd-pam-247.1-1.fc34.x86_64 281/302 Verifying : systemd-rpm-macros-247.1-1.fc34.noarch 282/302 Verifying : wayland-devel-1.18.0-2.fc33.x86_64 283/302 Verifying : wayland-protocols-devel-1.20-2.fc33.noarch 284/302 Verifying : webkit2gtk3-2.30.3-1.fc34.x86_64 285/302 Verifying : webkit2gtk3-jsc-2.30.3-1.fc34.x86_64 286/302 Verifying : woff2-1.0.2-9.fc33.x86_64 287/302 Verifying : wpebackend-fdo-1.8.0-1.fc34.x86_64 288/302 Verifying : wxBase3-3.0.5.1-2.fc33.x86_64 289/302 Verifying : wxBase3-devel-3.0.5.1-2.fc33.x86_64 290/302 Verifying : wxGTK3-3.0.5.1-2.fc33.x86_64 291/302 Verifying : wxGTK3-devel-3.0.5.1-2.fc33.x86_64 292/302 Verifying : wxGTK3-gl-3.0.5.1-2.fc33.x86_64 293/302 Verifying : wxGTK3-i18n-3.0.5.1-2.fc33.noarch 294/302 Verifying : wxGTK3-media-3.0.5.1-2.fc33.x86_64 295/302 Verifying : wxGTK3-webview-3.0.5.1-2.fc33.x86_64 296/302 Verifying : xdg-dbus-proxy-0.1.2-3.fc33.x86_64 297/302 Verifying : xkeyboard-config-2.31-3.fc34.noarch 298/302 Verifying : xml-common-0.6.3-55.fc33.noarch 299/302 Verifying : xorg-x11-proto-devel-2019.1-5.fc34.noarch 300/302 Verifying : xz-devel-5.2.5-3.fc33.x86_64 301/302 Verifying : zlib-devel-1.2.11-23.fc34.x86_64 302/302 Installed: SDL2-2.0.12-4.fc33.x86_64 SDL2-devel-2.0.12-4.fc33.x86_64 acl-2.2.53-9.fc34.x86_64 adwaita-cursor-theme-3.38.0-1.fc34.noarch adwaita-icon-theme-3.38.0-1.fc34.noarch alsa-lib-1.2.4-4.fc34.x86_64 alsa-lib-devel-1.2.4-4.fc34.x86_64 annobin-9.47-1.fc34.x86_64 at-spi2-atk-2.38.0-1.fc34.x86_64 at-spi2-atk-devel-2.38.0-1.fc34.x86_64 at-spi2-core-2.38.0-2.fc34.x86_64 at-spi2-core-devel-2.38.0-2.fc34.x86_64 atk-2.36.0-2.fc33.x86_64 atk-devel-2.36.0-2.fc33.x86_64 avahi-libs-0.8-6.fc34.x86_64 brotli-1.0.9-3.fc34.x86_64 brotli-devel-1.0.9-3.fc34.x86_64 bubblewrap-0.4.1-2.fc33.x86_64 bzip2-devel-1.0.8-4.fc33.x86_64 cairo-1.16.0-9.fc33.x86_64 cairo-devel-1.16.0-9.fc33.x86_64 cairo-gobject-1.16.0-9.fc33.x86_64 cairo-gobject-devel-1.16.0-9.fc33.x86_64 cdparanoia-libs-10.2-35.fc34.x86_64 cmake-filesystem-3.18.4-3.fc34.x86_64 colord-libs-1.4.5-1.fc34.x86_64 cpp-10.2.1-9.fc34.x86_64 cryptsetup-libs-2.3.4-1.fc34.x86_64 cups-libs-1:2.3.3-19.fc34.x86_64 dbus-1:1.12.20-2.fc33.x86_64 dbus-broker-24-1.fc34.x86_64 dbus-common-1:1.12.20-2.fc33.noarch dbus-devel-1:1.12.20-2.fc33.x86_64 dbus-libs-1:1.12.20-2.fc33.x86_64 dejavu-sans-fonts-2.37-15.fc34.noarch desktop-file-utils-0.26-2.fc33.x86_64 device-mapper-1.02.173-1.fc33.x86_64 device-mapper-libs-1.02.173-1.fc33.x86_64 emacs-filesystem-1:27.1-2.fc34.noarch enchant2-2.2.13-1.fc34.x86_64 fontconfig-2.13.93-2.fc34.x86_64 fontconfig-devel-2.13.93-2.fc34.x86_64 fonts-filesystem-1:2.0.5-4.fc33.noarch freetype-2.10.4-1.fc34.x86_64 freetype-devel-2.10.4-1.fc34.x86_64 fribidi-1.0.10-3.fc33.x86_64 fribidi-devel-1.0.10-3.fc33.x86_64 gcc-10.2.1-9.fc34.x86_64 gcc-c++-10.2.1-9.fc34.x86_64 gdbm-libs-1:1.18.1-5.fc33.x86_64 gdk-pixbuf2-2.40.0-3.fc33.x86_64 gdk-pixbuf2-devel-2.40.0-3.fc33.x86_64 gdk-pixbuf2-modules-2.40.0-3.fc33.x86_64 gettext-0.21-3.fc34.x86_64 gettext-libs-0.21-3.fc34.x86_64 git-2.29.2-3.fc34.x86_64 git-core-2.29.2-3.fc34.x86_64 git-core-doc-2.29.2-3.fc34.noarch gl-manpages-1.1-21.20190306.fc33.noarch glib-networking-2.66.0-1.fc34.x86_64 glib2-2.67.0-6.fc34.x86_64 glib2-devel-2.67.0-6.fc34.x86_64 glibc-devel-2.32.9000-17.fc34.x86_64 glibc-headers-x86-2.32.9000-17.fc34.noarch gnutls-3.6.15-2.fc34.x86_64 graphene-1.10.2-5.fc34.x86_64 graphite2-1.3.14-6.fc34.x86_64 graphite2-devel-1.3.14-6.fc34.x86_64 groff-base-1.22.4-4.fc34.x86_64 gsettings-desktop-schemas-3.38.0-1.fc34.x86_64 gstreamer1-1.18.1-1.fc34.x86_64 gstreamer1-plugins-base-1.18.1-1.fc34.x86_64 gtk-update-icon-cache-3.24.23-2.fc34.x86_64 gtk3-3.24.23-2.fc34.x86_64 gtk3-devel-3.24.23-2.fc34.x86_64 harfbuzz-2.7.2-1.fc34.x86_64 harfbuzz-devel-2.7.2-1.fc34.x86_64 harfbuzz-icu-2.7.2-1.fc34.x86_64 hicolor-icon-theme-0.17-9.fc33.noarch hunspell-1.7.0-7.fc33.x86_64 hunspell-en-US-0.20140811.1-17.fc33.noarch hwdata-0.342-1.fc34.noarch hyphen-2.8.8-14.fc33.x86_64 iptables-libs-1.8.6-5.fc34.x86_64 isl-0.16.1-12.fc33.x86_64 iso-codes-4.5.0-2.fc33.noarch jasper-libs-2.0.22-1.fc34.x86_64 jbigkit-libs-2.1-20.fc34.x86_64 json-c-0.14-7.fc33.x86_64 json-glib-1.6.0-1.fc34.x86_64 kernel-headers-5.10.0-0.rc6.git0.1.fc34.x86_64 kmod-libs-27-3.fc33.x86_64 langpacks-core-font-en-3.0-5.fc34.noarch lcms2-2.11-2.fc33.x86_64 less-551-4.fc33.x86_64 libICE-1.0.10-5.fc34.x86_64 libSM-1.2.3-7.fc34.x86_64 libX11-1.7.0-2.fc34.x86_64 libX11-common-1.7.0-2.fc34.noarch libX11-devel-1.7.0-2.fc34.x86_64 libX11-xcb-1.7.0-2.fc34.x86_64 libXau-1.0.9-5.fc34.x86_64 libXau-devel-1.0.9-5.fc34.x86_64 libXcomposite-0.4.5-4.fc34.x86_64 libXcomposite-devel-0.4.5-4.fc34.x86_64 libXcursor-1.2.0-4.fc34.x86_64 libXcursor-devel-1.2.0-4.fc34.x86_64 libXdamage-1.1.5-4.fc34.x86_64 libXdamage-devel-1.1.5-4.fc34.x86_64 libXext-1.3.4-5.fc34.x86_64 libXext-devel-1.3.4-5.fc34.x86_64 libXfixes-5.0.3-13.fc34.x86_64 libXfixes-devel-5.0.3-13.fc34.x86_64 libXft-2.3.3-5.fc34.x86_64 libXft-devel-2.3.3-5.fc34.x86_64 libXi-1.7.10-5.fc34.x86_64 libXi-devel-1.7.10-5.fc34.x86_64 libXinerama-1.1.4-7.fc34.x86_64 libXinerama-devel-1.1.4-7.fc34.x86_64 libXrandr-1.5.2-5.fc34.x86_64 libXrandr-devel-1.5.2-5.fc34.x86_64 libXrender-0.9.10-13.fc34.x86_64 libXrender-devel-0.9.10-13.fc34.x86_64 libXtst-1.2.3-12.fc33.x86_64 libXtst-devel-1.2.3-12.fc33.x86_64 libXv-1.0.11-13.fc34.x86_64 libXxf86vm-1.1.4-15.fc34.x86_64 libappstream-glib-0.7.18-1.fc34.x86_64 libargon2-20171227-5.fc33.x86_64 libblkid-devel-2.36.1-2.fc34.x86_64 libcbor-0.7.0-2.fc34.x86_64 libdatrie-0.2.9-13.fc34.x86_64 libdatrie-devel-0.2.9-13.fc34.x86_64 libdrm-2.4.103-1.fc34.x86_64 libedit-3.1-33.20191231cvs.fc33.x86_64 libepoxy-1.5.4-3.fc33.x86_64 libepoxy-devel-1.5.4-3.fc33.x86_64 libevent-2.1.12-2.fc34.x86_64 libffi-devel-3.1-26.fc33.x86_64 libfido2-1.5.0-3.fc34.x86_64 libglvnd-1:1.3.2-2.fc33.x86_64 libglvnd-core-devel-1:1.3.2-2.fc33.x86_64 libglvnd-devel-1:1.3.2-2.fc33.x86_64 libglvnd-egl-1:1.3.2-2.fc33.x86_64 libglvnd-gles-1:1.3.2-2.fc33.x86_64 libglvnd-glx-1:1.3.2-2.fc33.x86_64 libglvnd-opengl-1:1.3.2-2.fc33.x86_64 libgusb-0.3.5-1.fc33.x86_64 libibverbs-core-32.0-1.fc34.x86_64 libicu-67.1-4.fc33.x86_64 libicu-devel-67.1-4.fc33.x86_64 libjpeg-turbo-2.0.5-5.fc33.x86_64 libmnl-1.0.4-12.fc33.x86_64 libmount-devel-2.36.1-2.fc34.x86_64 libmpc-1.2.1-1.fc34.x86_64 libmspack-0.10.1-0.4.alpha.fc33.x86_64 libnetfilter_conntrack-1.0.7-5.fc33.x86_64 libnfnetlink-1.0.1-18.fc33.x86_64 libnl3-3.5.0-5.fc33.x86_64 libnotify-0.7.9-3.fc33.x86_64 libogg-2:1.3.4-3.fc33.x86_64 libpcap-14:1.9.1-6.fc34.x86_64 libpciaccess-0.16-3.fc33.x86_64 libpng-2:1.6.37-6.fc34.x86_64 libpng-devel-2:1.6.37-6.fc34.x86_64 libproxy-0.4.15-29.fc34.x86_64 libseccomp-2.5.0-3.fc33.x86_64 libsecret-0.20.4-1.fc34.x86_64 libselinux-devel-3.1-5.fc34.x86_64 libsepol-devel-3.1-5.fc34.x86_64 libsoup-2.72.0-3.fc34.x86_64 libstdc++-devel-10.2.1-9.fc34.x86_64 libstemmer-0-15.585svn.fc33.x86_64 libtextstyle-0.21-3.fc34.x86_64 libthai-0.1.28-5.fc33.x86_64 libthai-devel-0.1.28-5.fc33.x86_64 libtheora-1:1.1.1-28.fc33.x86_64 libtiff-4.1.0-5.fc34.x86_64 libunwind-1.4.0-4.fc34.x86_64 libusbx-1.0.23-2.fc33.x86_64 libvisual-1:0.4.0-29.fc33.x86_64 libvorbis-1:1.3.7-2.fc33.x86_64 libwayland-client-1.18.0-2.fc33.x86_64 libwayland-cursor-1.18.0-2.fc33.x86_64 libwayland-egl-1.18.0-2.fc33.x86_64 libwayland-server-1.18.0-2.fc33.x86_64 libwebp-1.1.0-5.fc33.x86_64 libwpe-1.8.0-1.fc34.x86_64 libxcb-1.13.1-6.fc34.x86_64 libxcb-devel-1.13.1-6.fc34.x86_64 libxcrypt-devel-4.4.17-1.fc34.x86_64 libxkbcommon-1.0.3-1.fc34.x86_64 libxkbcommon-devel-1.0.3-1.fc34.x86_64 libxml2-devel-2.9.10-9.fc34.x86_64 libxshmfence-1.3-7.fc33.x86_64 libxslt-1.1.34-4.fc34.x86_64 llvm-libs-11.0.0-2.fc34.x86_64 mesa-libEGL-20.3.0~rc3-2.fc34.x86_64 mesa-libEGL-devel-20.3.0~rc3-2.fc34.x86_64 mesa-libGL-20.3.0~rc3-2.fc34.x86_64 mesa-libGLU-9.0.1-3.fc33.x86_64 mesa-libGLU-devel-9.0.1-3.fc33.x86_64 mesa-libgbm-20.3.0~rc3-2.fc34.x86_64 mesa-libglapi-20.3.0~rc3-2.fc34.x86_64 ncurses-6.2-3.20200222.fc33.x86_64 nettle-3.6-3.fc33.x86_64 openal-soft-1.19.1-9.fc34.x86_64 openal-soft-devel-1.19.1-9.fc34.x86_64 openjpeg2-2.3.1-8.fc34.x86_64 openssh-8.4p1-4.fc34.x86_64 openssh-clients-8.4p1-4.fc34.x86_64 opus-1.3.1-7.fc34.x86_64 orc-0.4.31-3.fc33.x86_64 pango-1.48.0-1.fc34.x86_64 pango-devel-1.48.0-1.fc34.x86_64 pcre-cpp-8.44-2.fc34.x86_64 pcre-devel-8.44-2.fc34.x86_64 pcre-utf16-8.44-2.fc34.x86_64 pcre-utf32-8.44-2.fc34.x86_64 pcre2-devel-10.36-0.1.RC1.fc34.x86_64 pcre2-utf16-10.36-0.1.RC1.fc34.x86_64 pcre2-utf32-10.36-0.1.RC1.fc34.x86_64 perl-Carp-1.50-457.fc33.noarch perl-Class-Struct-0.66-467.fc34.noarch perl-DynaLoader-1.47-467.fc34.x86_64 perl-Encode-4:3.07-457.fc33.x86_64 perl-Errno-1.30-467.fc34.x86_64 perl-Error-1:0.17029-4.fc33.noarch perl-Exporter-5.74-458.fc33.noarch perl-Fcntl-1.13-467.fc34.x86_64 perl-File-Basename-2.85-467.fc34.noarch perl-File-Find-1.37-467.fc34.noarch perl-File-Path-2.18-1.fc34.noarch perl-File-Temp-1:0.231.100-1.fc34.noarch perl-File-stat-1.09-467.fc34.noarch perl-Getopt-Long-1:2.52-1.fc34.noarch perl-Getopt-Std-1.12-467.fc34.noarch perl-Git-2.29.2-3.fc34.noarch perl-HTTP-Tiny-0.076-457.fc33.noarch perl-IO-1.43-467.fc34.x86_64 perl-IPC-Open3-1.21-467.fc34.noarch perl-MIME-Base64-3.16-1.fc34.x86_64 perl-POSIX-1.94-467.fc34.x86_64 perl-PathTools-3.78-458.fc34.x86_64 perl-Pod-Escapes-1:1.07-457.fc33.noarch perl-Pod-Perldoc-3.28.01-458.fc33.noarch perl-Pod-Simple-1:3.42-1.fc34.noarch perl-Pod-Usage-4:2.01-1.fc34.noarch perl-Scalar-List-Utils-4:1.55-457.fc33.x86_64 perl-SelectSaver-1.02-467.fc34.noarch perl-Socket-4:2.030-2.fc33.x86_64 perl-Storable-1:3.21-457.fc33.x86_64 perl-Symbol-1.08-467.fc34.noarch perl-Term-ANSIColor-5.01-458.fc33.noarch perl-Term-Cap-1.17-457.fc33.noarch perl-TermReadKey-2.38-8.fc33.x86_64 perl-Text-ParseWords-3.30-457.fc33.noarch perl-Text-Tabs+Wrap-2013.0523-457.fc33.noarch perl-Time-Local-2:1.300-4.fc33.noarch perl-constant-1.33-458.fc33.noarch perl-if-0.60.800-467.fc34.noarch perl-interpreter-4:5.32.0-467.fc34.x86_64 perl-lib-0.65-467.fc34.x86_64 perl-libs-4:5.32.0-467.fc34.x86_64 perl-mro-1.23-467.fc34.x86_64 perl-overload-1.31-467.fc34.noarch perl-overloading-0.02-467.fc34.noarch perl-parent-1:0.238-457.fc33.noarch perl-podlators-1:4.14-457.fc33.noarch perl-subs-1.03-467.fc34.noarch perl-vars-1.05-467.fc34.noarch pixman-0.40.0-2.fc33.x86_64 pixman-devel-0.40.0-2.fc33.x86_64 python-pip-wheel-20.2.4-1.fc34.noarch python-setuptools-wheel-50.3.2-1.fc34.noarch python3-3.9.1~rc1-1.fc34.x86_64 python3-libs-3.9.1~rc1-1.fc34.x86_64 rest-0.8.1-8.fc33.x86_64 shared-mime-info-2.0-5.fc34.x86_64 systemd-247.1-1.fc34.x86_64 systemd-pam-247.1-1.fc34.x86_64 systemd-rpm-macros-247.1-1.fc34.noarch wayland-devel-1.18.0-2.fc33.x86_64 wayland-protocols-devel-1.20-2.fc33.noarch webkit2gtk3-2.30.3-1.fc34.x86_64 webkit2gtk3-jsc-2.30.3-1.fc34.x86_64 woff2-1.0.2-9.fc33.x86_64 wpebackend-fdo-1.8.0-1.fc34.x86_64 wxBase3-3.0.5.1-2.fc33.x86_64 wxBase3-devel-3.0.5.1-2.fc33.x86_64 wxGTK3-3.0.5.1-2.fc33.x86_64 wxGTK3-devel-3.0.5.1-2.fc33.x86_64 wxGTK3-gl-3.0.5.1-2.fc33.x86_64 wxGTK3-i18n-3.0.5.1-2.fc33.noarch wxGTK3-media-3.0.5.1-2.fc33.x86_64 wxGTK3-webview-3.0.5.1-2.fc33.x86_64 xdg-dbus-proxy-0.1.2-3.fc33.x86_64 xkeyboard-config-2.31-3.fc34.noarch xml-common-0.6.3-55.fc33.noarch xorg-x11-proto-devel-2019.1-5.fc34.noarch xz-devel-5.2.5-3.fc33.x86_64 zlib-devel-1.2.11-23.fc34.x86_64 Complete! Finish: build setup for pcem-17-1.fc34.src.rpm Start: rpmbuild pcem-17-1.fc34.src.rpm Building target platforms: x86_64 Building for target x86_64 setting SOURCE_DATE_EPOCH=1606953600 Executing(%prep): /bin/sh -e /var/tmp/rpm-tmp.vVGn5t + umask 022 + cd /builddir/build/BUILD + cd /builddir/build/BUILD + rm -rf pcem-17 + /usr/bin/mkdir -p pcem-17 + cd pcem-17 + /usr/bin/gzip -dc /builddir/build/SOURCES/PCemV17Linux.tar.gz + /usr/bin/tar -xof - + STATUS=0 + '[' 0 -ne 0 ']' + /usr/bin/chmod -Rf a+rX,u+w,g-w,o-w . + /usr/bin/git init -q + /usr/bin/git config user.name rpm-build + /usr/bin/git config user.email '' + /usr/bin/git config gc.auto 0 + /usr/bin/git add --force . + /usr/bin/git commit -q --allow-empty -a --author 'rpm-build ' -m 'pcem-17 base' + RPM_EC=0 ++ jobs -p + exit 0 Executing(%build): /bin/sh -e /var/tmp/rpm-tmp.XeHiau + umask 022 + cd /builddir/build/BUILD + cd pcem-17 + CFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' + export CFLAGS + CXXFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection' + export CXXFLAGS + FFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -I/usr/lib64/gfortran/modules' + export FFLAGS + FCFLAGS='-O2 -flto=auto -ffat-lto-objects -fexceptions -g -grecord-gcc-switches -pipe -Wall -Werror=format-security -Wp,-D_FORTIFY_SOURCE=2 -Wp,-D_GLIBCXX_ASSERTIONS -specs=/usr/lib/rpm/redhat/redhat-annobin-cc1 -m64 -mtune=generic -fasynchronous-unwind-tables -fstack-clash-protection -fcf-protection -I/usr/lib64/gfortran/modules' + export FCFLAGS + LDFLAGS='-Wl,-z,relro -Wl,--as-needed ' + export LDFLAGS + LT_SYS_LIBRARY_PATH=/usr/lib64: + export LT_SYS_LIBRARY_PATH + CC=gcc + export CC + CXX=g++ + export CXX + '[' '-flto=auto -ffat-lto-objectsx' '!=' x ']' ++ find . -type f -name configure -print + for file in $(find . -type f -name configure -print) + /usr/bin/sed -r --in-place=.backup 's/^char \(\*f\) \(\) = /__attribute__ ((used)) char (*f) () = /g' ./configure + diff -u ./configure.backup ./configure + mv ./configure.backup ./configure + /usr/bin/sed -r --in-place=.backup 's/^char \(\*f\) \(\);/__attribute__ ((used)) char (*f) ();/g' ./configure + diff -u ./configure.backup ./configure + mv ./configure.backup ./configure + /usr/bin/sed -r --in-place=.backup 's/^char \$2 \(\);/__attribute__ ((used)) char \$2 ();/g' ./configure + diff -u ./configure.backup ./configure + mv ./configure.backup ./configure + /usr/bin/sed --in-place=.backup '1{$!N;$!N};$!N;s/int x = 1;\nint y = 0;\nint z;\nint nan;/volatile int x = 1; volatile int y = 0; volatile int z, nan;/;P;D' ./configure + diff -u ./configure.backup ./configure + mv ./configure.backup ./configure + /usr/bin/sed --in-place=.backup 's#^lt_cv_sys_global_symbol_to_cdecl=.*#lt_cv_sys_global_symbol_to_cdecl="sed -n -e '\''s/^T .* \\(.*\\)$/extern int \\1();/p'\'' -e '\''s/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\''"#' ./configure + diff -u ./configure.backup ./configure + mv ./configure.backup ./configure + '[' 1 = 1 ']' +++ dirname ./configure ++ find . -name config.guess -o -name config.sub + for i in $(find $(dirname ./configure) -name config.guess -o -name config.sub) ++ basename ./config.sub + '[' -f /usr/lib/rpm/redhat/config.sub ']' + /usr/bin/rm -f ./config.sub ++ basename ./config.sub + /usr/bin/cp -fv /usr/lib/rpm/redhat/config.sub ./config.sub '/usr/lib/rpm/redhat/config.sub' -> './config.sub' + for i in $(find $(dirname ./configure) -name config.guess -o -name config.sub) ++ basename ./config.guess + '[' -f /usr/lib/rpm/redhat/config.guess ']' + /usr/bin/rm -f ./config.guess ++ basename ./config.guess + /usr/bin/cp -fv /usr/lib/rpm/redhat/config.guess ./config.guess '/usr/lib/rpm/redhat/config.guess' -> './config.guess' + '[' 1 = 1 ']' + '[' x '!=' x ']' + ./configure --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --enable-release-build --enable-networking --enable-alsa checking build system type... x86_64-redhat-linux-gnu checking host system type... x86_64-redhat-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking whether build environment is sane... yes checking for a thread-safe mkdir -p... /usr/bin/mkdir -p checking for gawk... gawk checking whether make sets $(MAKE)... yes checking whether make supports nested variables... yes checking for x86_64-redhat-linux-gnu-gcc... gcc checking whether the C compiler works... yes checking for C compiler default output file name... a.out checking for suffix of executables... checking whether we are cross compiling... no checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ISO C89... none needed checking whether gcc understands -c and -o together... yes checking for style of include used by make... GNU checking dependency style of gcc... none checking whether we are using the GNU C++ compiler... yes checking whether g++ accepts -g... yes checking dependency style of g++... none checking whether to build for release... yes checking whether to enable debugging... no checking whether to enable networking... yes checking whether to use ALSA for MIDI output... yes checking for cpu... x86_64 checking for off64_t x86_64... no checking for x86_64-redhat-linux-gnu-pkg-config... /usr/bin/x86_64-redhat-linux-gnu-pkg-config checking pkg-config is at least version 0.9.0... yes checking for SDL... yes checking for wx-config... /usr/bin/wx-config checking for wxWidgets version >= 3.0.0... yes (version 3.0.5) checking for wxWidgets static library... no checking for snd_pcm_open in -lasound... yes checking for pthread_create in -lpthread... yes checking for glGetError in -lGL... yes checking for alGetError in -lopenal... yes checking that generated files are newer than configure... done configure: creating ./config.status config.status: creating Makefile config.status: creating src/Makefile config.status: executing depfiles commands + /usr/bin/make -O -j2 V=1 VERBOSE=1 'CFLAGS=-O3 -g -fcommon' 'CXXFLAGS=-O3 -g -fcommon' Making all in src make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-386.o `test -f '386.c' || echo './'`386.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-386_common.o `test -f '386_common.c' || echo './'`386_common.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-386_dynarec_ops.o `test -f '386_dynarec_ops.c' || echo './'`386_dynarec_ops.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-808x.o `test -f '808x.c' || echo './'`808x.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-82091aa.o `test -f '82091aa.c' || echo './'`82091aa.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-acc2036.o `test -f 'acc2036.c' || echo './'`acc2036.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-acc2168.o `test -f 'acc2168.c' || echo './'`acc2168.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-acc3221.o `test -f 'acc3221.c' || echo './'`acc3221.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-acer386sx.o `test -f 'acer386sx.c' || echo './'`acer386sx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ali1429.o `test -f 'ali1429.c' || echo './'`ali1429.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-amstrad.o `test -f 'amstrad.c' || echo './'`amstrad.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cassette.o `test -f 'cassette.c' || echo './'`cassette.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cbm_io.o `test -f 'cbm_io.c' || echo './'`cbm_io.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cdrom-image.o `test -f 'cdrom-image.cc' || echo './'`cdrom-image.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cdrom-null.o `test -f 'cdrom-null.c' || echo './'`cdrom-null.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cmd640.o `test -f 'cmd640.c' || echo './'`cmd640.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen.o `test -f 'codegen.c' || echo './'`codegen.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_accumulate.o `test -f 'codegen_accumulate.c' || echo './'`codegen_accumulate.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_allocator.o `test -f 'codegen_allocator.c' || echo './'`codegen_allocator.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_block.o `test -f 'codegen_block.c' || echo './'`codegen_block.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ir.o `test -f 'codegen_ir.c' || echo './'`codegen_ir.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops.o `test -f 'codegen_ops.c' || echo './'`codegen_ops.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_3dnow.o `test -f 'codegen_ops_3dnow.c' || echo './'`codegen_ops_3dnow.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-386_dynarec.o `test -f '386_dynarec.c' || echo './'`386_dynarec.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_arith.o `test -f 'codegen_ops_arith.c' || echo './'`codegen_ops_arith.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_branch.o `test -f 'codegen_ops_branch.c' || echo './'`codegen_ops_branch.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_fpu_constant.o `test -f 'codegen_ops_fpu_constant.c' || echo './'`codegen_ops_fpu_constant.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_fpu_arith.o `test -f 'codegen_ops_fpu_arith.c' || echo './'`codegen_ops_fpu_arith.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_fpu_loadstore.o `test -f 'codegen_ops_fpu_loadstore.c' || echo './'`codegen_ops_fpu_loadstore.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_fpu_misc.o `test -f 'codegen_ops_fpu_misc.c' || echo './'`codegen_ops_fpu_misc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_cmp.o `test -f 'codegen_ops_mmx_cmp.c' || echo './'`codegen_ops_mmx_cmp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_loadstore.o `test -f 'codegen_ops_mmx_loadstore.c' || echo './'`codegen_ops_mmx_loadstore.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_arith.o `test -f 'codegen_ops_mmx_arith.c' || echo './'`codegen_ops_mmx_arith.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_logic.o `test -f 'codegen_ops_mmx_logic.c' || echo './'`codegen_ops_mmx_logic.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_shift.o `test -f 'codegen_ops_mmx_shift.c' || echo './'`codegen_ops_mmx_shift.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_helpers.o `test -f 'codegen_ops_helpers.c' || echo './'`codegen_ops_helpers.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mmx_pack.o `test -f 'codegen_ops_mmx_pack.c' || echo './'`codegen_ops_mmx_pack.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_jump.o `test -f 'codegen_ops_jump.c' || echo './'`codegen_ops_jump.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_logic.o `test -f 'codegen_ops_logic.c' || echo './'`codegen_ops_logic.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_shift.o `test -f 'codegen_ops_shift.c' || echo './'`codegen_ops_shift.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_misc.o `test -f 'codegen_ops_misc.c' || echo './'`codegen_ops_misc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_mov.o `test -f 'codegen_ops_mov.c' || echo './'`codegen_ops_mov.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_reg.o `test -f 'codegen_reg.c' || echo './'`codegen_reg.c codegen_reg.c: In function 'codegen_reg_write_imm': codegen_reg.c:512:66: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 512 | codegen_direct_write_32_imm_stack(block, (int)p, imm_data); | ^ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_486.o `test -f 'codegen_timing_486.c' || echo './'`codegen_timing_486.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_686.o `test -f 'codegen_timing_686.c' || echo './'`codegen_timing_686.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_common.o `test -f 'codegen_timing_common.c' || echo './'`codegen_timing_common.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_cyrixiii.o `test -f 'codegen_timing_cyrixiii.c' || echo './'`codegen_timing_cyrixiii.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_k6.o `test -f 'codegen_timing_k6.c' || echo './'`codegen_timing_k6.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_ops_stack.o `test -f 'codegen_ops_stack.c' || echo './'`codegen_ops_stack.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_p6.o `test -f 'codegen_timing_p6.c' || echo './'`codegen_timing_p6.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_winchip.o `test -f 'codegen_timing_winchip.c' || echo './'`codegen_timing_winchip.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_pentium.o `test -f 'codegen_timing_pentium.c' || echo './'`codegen_timing_pentium.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-compaq.o `test -f 'compaq.c' || echo './'`compaq.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_timing_winchip2.o `test -f 'codegen_timing_winchip2.c' || echo './'`codegen_timing_winchip2.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-config.o `test -f 'config.c' || echo './'`config.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cpu_tables.o `test -f 'cpu_tables.c' || echo './'`cpu_tables.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cs8230.o `test -f 'cs8230.c' || echo './'`cs8230.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-dells200.o `test -f 'dells200.c' || echo './'`dells200.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-device.o `test -f 'device.c' || echo './'`device.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cpu.o `test -f 'cpu.c' || echo './'`cpu.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-disc.o `test -f 'disc.c' || echo './'`disc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-disc_img.o `test -f 'disc_img.c' || echo './'`disc_img.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-disc_fdi.o `test -f 'disc_fdi.c' || echo './'`disc_fdi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-disc_sector.o `test -f 'disc_sector.c' || echo './'`disc_sector.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-dma.o `test -f 'dma.c' || echo './'`dma.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-esdi_at.o `test -f 'esdi_at.c' || echo './'`esdi_at.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-f82c710_upc.o `test -f 'f82c710_upc.c' || echo './'`f82c710_upc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-fdc37c665.o `test -f 'fdc37c665.c' || echo './'`fdc37c665.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-fdc37c93x.o `test -f 'fdc37c93x.c' || echo './'`fdc37c93x.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-fdd.o `test -f 'fdd.c' || echo './'`fdd.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-fdc.o `test -f 'fdc.c' || echo './'`fdc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-gameport.o `test -f 'gameport.c' || echo './'`gameport.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-hdd.o `test -f 'hdd.c' || echo './'`hdd.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-hdd_esdi.o `test -f 'hdd_esdi.c' || echo './'`hdd_esdi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-hdd_file.o `test -f 'hdd_file.c' || echo './'`hdd_file.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-headland.o `test -f 'headland.c' || echo './'`headland.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i430lx.o `test -f 'i430lx.c' || echo './'`i430lx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i430fx.o `test -f 'i430fx.c' || echo './'`i430fx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i430hx.o `test -f 'i430hx.c' || echo './'`i430hx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i430vx.o `test -f 'i430vx.c' || echo './'`i430vx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i440fx.o `test -f 'i440fx.c' || echo './'`i440fx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-i440bx.o `test -f 'i440bx.c' || echo './'`i440bx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ide.o `test -f 'ide.c' || echo './'`ide.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ide_atapi.o `test -f 'ide_atapi.c' || echo './'`ide_atapi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-fdi2raw.o `test -f 'fdi2raw.c' || echo './'`fdi2raw.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ide_sff8038i.o `test -f 'ide_sff8038i.c' || echo './'`ide_sff8038i.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-intel.o `test -f 'intel.c' || echo './'`intel.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-intel_flash.o `test -f 'intel_flash.c' || echo './'`intel_flash.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-jim.o `test -f 'jim.c' || echo './'`jim.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-io.o `test -f 'io.c' || echo './'`io.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-joystick_ch_flightstick_pro.o `test -f 'joystick_ch_flightstick_pro.c' || echo './'`joystick_ch_flightstick_pro.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-joystick_standard.o `test -f 'joystick_standard.c' || echo './'`joystick_standard.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-joystick_tm_fcs.o `test -f 'joystick_tm_fcs.c' || echo './'`joystick_tm_fcs.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-joystick_sw_pad.o `test -f 'joystick_sw_pad.c' || echo './'`joystick_sw_pad.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard.o `test -f 'keyboard.c' || echo './'`keyboard.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard_amstrad.o `test -f 'keyboard_amstrad.c' || echo './'`keyboard_amstrad.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard_olim24.o `test -f 'keyboard_olim24.c' || echo './'`keyboard_olim24.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard_at.o `test -f 'keyboard_at.c' || echo './'`keyboard_at.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard_pcjr.o `test -f 'keyboard_pcjr.c' || echo './'`keyboard_pcjr.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-keyboard_xt.o `test -f 'keyboard_xt.c' || echo './'`keyboard_xt.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-laserxt.o `test -f 'laserxt.c' || echo './'`laserxt.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-lpt.o `test -f 'lpt.c' || echo './'`lpt.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-lpt_dac.o `test -f 'lpt_dac.c' || echo './'`lpt_dac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-lpt_dss.o `test -f 'lpt_dss.c' || echo './'`lpt_dss.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mca.o `test -f 'mca.c' || echo './'`mca.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mcr.o `test -f 'mcr.c' || echo './'`mcr.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mem_bios.o `test -f 'mem_bios.c' || echo './'`mem_bios.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mfm_at.o `test -f 'mfm_at.c' || echo './'`mfm_at.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mem.o `test -f 'mem.c' || echo './'`mem.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mfm_xebec.o `test -f 'mfm_xebec.c' || echo './'`mfm_xebec.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mouse.o `test -f 'mouse.c' || echo './'`mouse.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mouse_msystems.o `test -f 'mouse_msystems.c' || echo './'`mouse_msystems.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mouse_ps2.o `test -f 'mouse_ps2.c' || echo './'`mouse_ps2.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-model.o `test -f 'model.c' || echo './'`model.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mouse_serial.o `test -f 'mouse_serial.c' || echo './'`mouse_serial.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-neat.o `test -f 'neat.c' || echo './'`neat.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-mvp3.o `test -f 'mvp3.c' || echo './'`mvp3.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-nmi.o `test -f 'nmi.c' || echo './'`nmi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-olivetti_m24.o `test -f 'olivetti_m24.c' || echo './'`olivetti_m24.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-opti495.o `test -f 'opti495.c' || echo './'`opti495.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-nvr.o `test -f 'nvr.c' || echo './'`nvr.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-paths.o `test -f 'paths.c' || echo './'`paths.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pc87306.o `test -f 'pc87306.c' || echo './'`pc87306.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pc87307.o `test -f 'pc87307.c' || echo './'`pc87307.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pci.o `test -f 'pci.c' || echo './'`pci.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pc.o `test -f 'pc.c' || echo './'`pc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-piix.o `test -f 'piix.c' || echo './'`piix.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pic.o `test -f 'pic.c' || echo './'`pic.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-piix_pm.o `test -f 'piix_pm.c' || echo './'`piix_pm.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ppi.o `test -f 'ppi.c' || echo './'`ppi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ps1.o `test -f 'ps1.c' || echo './'`ps1.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ps2.o `test -f 'ps2.c' || echo './'`ps2.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pit.o `test -f 'pit.c' || echo './'`pit.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ps2_nvr.o `test -f 'ps2_nvr.c' || echo './'`ps2_nvr.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-nvr_tc8521.o `test -f 'nvr_tc8521.c' || echo './'`nvr_tc8521.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ps2_mca.o `test -f 'ps2_mca.c' || echo './'`ps2_mca.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-rom.o `test -f 'rom.c' || echo './'`rom.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-pzx.o `test -f 'pzx.c' || echo './'`pzx.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-rtc_tc8521.o `test -f 'rtc_tc8521.c' || echo './'`rtc_tc8521.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-rtc.o `test -f 'rtc.c' || echo './'`rtc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scamp.o `test -f 'scamp.c' || echo './'`scamp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi.o `test -f 'scsi.c' || echo './'`scsi.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_53c400.o `test -f 'scsi_53c400.c' || echo './'`scsi_53c400.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scat.o `test -f 'scat.c' || echo './'`scat.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_cd.o `test -f 'scsi_cd.c' || echo './'`scsi_cd.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_aha1540.o `test -f 'scsi_aha1540.c' || echo './'`scsi_aha1540.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_hd.o `test -f 'scsi_hd.c' || echo './'`scsi_hd.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_ibm.o `test -f 'scsi_ibm.c' || echo './'`scsi_ibm.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-serial.o `test -f 'serial.c' || echo './'`serial.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sio.o `test -f 'sio.c' || echo './'`sio.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sis496.o `test -f 'sis496.c' || echo './'`sis496.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sl82c460.o `test -f 'sl82c460.c' || echo './'`sl82c460.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-scsi_zip.o `test -f 'scsi_zip.c' || echo './'`scsi_zip.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_ad1848.o `test -f 'sound_ad1848.c' || echo './'`sound_ad1848.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_adlib.o `test -f 'sound_adlib.c' || echo './'`sound_adlib.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound.o `test -f 'sound.c' || echo './'`sound.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_adlibgold.o `test -f 'sound_adlibgold.c' || echo './'`sound_adlibgold.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_audiopci.o `test -f 'sound_audiopci.c' || echo './'`sound_audiopci.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_cms.o `test -f 'sound_cms.c' || echo './'`sound_cms.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_azt2316a.o `test -f 'sound_azt2316a.c' || echo './'`sound_azt2316a.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_gus.o `test -f 'sound_gus.c' || echo './'`sound_gus.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_mpu401_uart.o `test -f 'sound_mpu401_uart.c' || echo './'`sound_mpu401_uart.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_opl.o `test -f 'sound_opl.c' || echo './'`sound_opl.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_emu8k.o `test -f 'sound_emu8k.c' || echo './'`sound_emu8k.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_ps1.o `test -f 'sound_ps1.c' || echo './'`sound_ps1.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_pssj.o `test -f 'sound_pssj.c' || echo './'`sound_pssj.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_pas16.o `test -f 'sound_pas16.c' || echo './'`sound_pas16.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_sb_dsp.o `test -f 'sound_sb_dsp.c' || echo './'`sound_sb_dsp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_sn76489.o `test -f 'sound_sn76489.c' || echo './'`sound_sn76489.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_sb.o `test -f 'sound_sb.c' || echo './'`sound_sb.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_ssi2001.o `test -f 'sound_ssi2001.c' || echo './'`sound_ssi2001.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_speaker.o `test -f 'sound_speaker.c' || echo './'`sound_speaker.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_wss.o `test -f 'sound_wss.c' || echo './'`sound_wss.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_ym7128.o `test -f 'sound_ym7128.c' || echo './'`sound_ym7128.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-soundopenal.o `test -f 'soundopenal.c' || echo './'`soundopenal.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sst39sf010.o `test -f 'sst39sf010.c' || echo './'`sst39sf010.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-superxt.o `test -f 'superxt.c' || echo './'`superxt.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-tandy_eeprom.o `test -f 'tandy_eeprom.c' || echo './'`tandy_eeprom.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-tandy_rom.o `test -f 'tandy_rom.c' || echo './'`tandy_rom.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-t1000.o `test -f 't1000.c' || echo './'`t1000.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-t3100e.o `test -f 't3100e.c' || echo './'`t3100e.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-timer.o `test -f 'timer.c' || echo './'`timer.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-um8669f.o `test -f 'um8669f.c' || echo './'`um8669f.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-um8881f.o `test -f 'um8881f.c' || echo './'`um8881f.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ati_eeprom.o `test -f 'vid_ati_eeprom.c' || echo './'`vid_ati_eeprom.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ati18800.o `test -f 'vid_ati18800.c' || echo './'`vid_ati18800.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ati28800.o `test -f 'vid_ati28800.c' || echo './'`vid_ati28800.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ati68860_ramdac.o `test -f 'vid_ati68860_ramdac.c' || echo './'`vid_ati68860_ramdac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_cga.o `test -f 'vid_cga.c' || echo './'`vid_cga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ati_mach64.o `test -f 'vid_ati_mach64.c' || echo './'`vid_ati_mach64.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_cl5429.o `test -f 'vid_cl5429.c' || echo './'`vid_cl5429.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_colorplus.o `test -f 'vid_colorplus.c' || echo './'`vid_colorplus.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ddc.o `test -f 'vid_ddc.c' || echo './'`vid_ddc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_compaq_cga.o `test -f 'vid_compaq_cga.c' || echo './'`vid_compaq_cga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_et4000.o `test -f 'vid_et4000.c' || echo './'`vid_et4000.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ega.o `test -f 'vid_ega.c' || echo './'`vid_ega.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_et4000w32.o `test -f 'vid_et4000w32.c' || echo './'`vid_et4000w32.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_genius.o `test -f 'vid_genius.c' || echo './'`vid_genius.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_hercules.o `test -f 'vid_hercules.c' || echo './'`vid_hercules.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_icd2061.o `test -f 'vid_icd2061.c' || echo './'`vid_icd2061.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ics2595.o `test -f 'vid_ics2595.c' || echo './'`vid_ics2595.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ht216.o `test -f 'vid_ht216.c' || echo './'`vid_ht216.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_im1024.o `test -f 'vid_im1024.c' || echo './'`vid_im1024.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_mda.o `test -f 'vid_mda.c' || echo './'`vid_mda.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_incolor.o `test -f 'vid_incolor.c' || echo './'`vid_incolor.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_olivetti_m24.o `test -f 'vid_olivetti_m24.c' || echo './'`vid_olivetti_m24.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_oti037.o `test -f 'vid_oti037.c' || echo './'`vid_oti037.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_oti067.o `test -f 'vid_oti067.c' || echo './'`vid_oti067.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_paradise.o `test -f 'vid_paradise.c' || echo './'`vid_paradise.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_pc200.o `test -f 'vid_pc200.c' || echo './'`vid_pc200.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_mga.o `test -f 'vid_mga.c' || echo './'`vid_mga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_pc1640.o `test -f 'vid_pc1640.c' || echo './'`vid_pc1640.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_pc1512.o `test -f 'vid_pc1512.c' || echo './'`vid_pc1512.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_pcjr.o `test -f 'vid_pcjr.c' || echo './'`vid_pcjr.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_ps1_svga.o `test -f 'vid_ps1_svga.c' || echo './'`vid_ps1_svga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_pgc.o `test -f 'vid_pgc.c' || echo './'`vid_pgc.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_s3.o `test -f 'vid_s3.c' || echo './'`vid_s3.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_sdac_ramdac.o `test -f 'vid_sdac_ramdac.c' || echo './'`vid_sdac_ramdac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_sigma.o `test -f 'vid_sigma.c' || echo './'`vid_sigma.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_stg_ramdac.o `test -f 'vid_stg_ramdac.c' || echo './'`vid_stg_ramdac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_svga.o `test -f 'vid_svga.c' || echo './'`vid_svga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_s3_virge.o `test -f 'vid_s3_virge.c' || echo './'`vid_s3_virge.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_svga_render.o `test -f 'vid_svga_render.c' || echo './'`vid_svga_render.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_t1000.o `test -f 'vid_t1000.c' || echo './'`vid_t1000.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_t3100e.o `test -f 'vid_t3100e.c' || echo './'`vid_t3100e.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_tandy.o `test -f 'vid_tandy.c' || echo './'`vid_tandy.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_tandysl.o `test -f 'vid_tandysl.c' || echo './'`vid_tandysl.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_tkd8001_ramdac.o `test -f 'vid_tkd8001_ramdac.c' || echo './'`vid_tkd8001_ramdac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_tvga.o `test -f 'vid_tvga.c' || echo './'`vid_tvga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_unk_ramdac.o `test -f 'vid_unk_ramdac.c' || echo './'`vid_unk_ramdac.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_vga.o `test -f 'vid_vga.c' || echo './'`vid_vga.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_tgui9440.o `test -f 'vid_tgui9440.c' || echo './'`vid_tgui9440.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo.o `test -f 'vid_voodoo.c' || echo './'`vid_voodoo.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_banshee_blitter.o `test -f 'vid_voodoo_banshee_blitter.c' || echo './'`vid_voodoo_banshee_blitter.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_blitter.o `test -f 'vid_voodoo_blitter.c' || echo './'`vid_voodoo_blitter.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_display.o `test -f 'vid_voodoo_display.c' || echo './'`vid_voodoo_display.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_banshee.o `test -f 'vid_voodoo_banshee.c' || echo './'`vid_voodoo_banshee.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_fb.o `test -f 'vid_voodoo_fb.c' || echo './'`vid_voodoo_fb.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_fifo.o `test -f 'vid_voodoo_fifo.c' || echo './'`vid_voodoo_fifo.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_reg.o `test -f 'vid_voodoo_reg.c' || echo './'`vid_voodoo_reg.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_setup.o `test -f 'vid_voodoo_setup.c' || echo './'`vid_voodoo_setup.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_texture.o `test -f 'vid_voodoo_texture.c' || echo './'`vid_voodoo_texture.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-video.o `test -f 'video.c' || echo './'`video.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wd76c10.o `test -f 'wd76c10.c' || echo './'`wd76c10.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_wy700.o `test -f 'vid_wy700.c' || echo './'`vid_wy700.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vt82c586b.o `test -f 'vt82c586b.c' || echo './'`vt82c586b.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vl82c480.o `test -f 'vl82c480.c' || echo './'`vl82c480.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-w83877tf.o `test -f 'w83877tf.c' || echo './'`w83877tf.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-w83977tf.o `test -f 'w83977tf.c' || echo './'`w83977tf.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-x86seg.o `test -f 'x86seg.c' || echo './'`x86seg.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-x87.o `test -f 'x87.c' || echo './'`x87.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-x87_timings.o `test -f 'x87_timings.c' || echo './'`x87_timings.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-xi8088.o `test -f 'xi8088.c' || echo './'`xi8088.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-xtide.o `test -f 'xtide.c' || echo './'`xtide.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_dbopl.o `test -f 'sound_dbopl.cc' || echo './'`sound_dbopl.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-sound_resid.o `test -f 'sound_resid.cc' || echo './'`sound_resid.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-vid_voodoo_render.o `test -f 'vid_voodoo_render.c' || echo './'`vid_voodoo_render.c In file included from vid_voodoo_render.c:648: In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1086:17: note: in expansion of macro 'addbyte' 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1086:17: note: in expansion of macro 'addbyte' 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1243:25: note: in expansion of macro 'addbyte' 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1243:25: note: in expansion of macro 'addbyte' 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1251:25: note: in expansion of macro 'addbyte' 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1326:25: note: in expansion of macro 'addbyte' 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1326:25: note: in expansion of macro 'addbyte' 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1389:17: note: in expansion of macro 'addbyte' 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1389:17: note: in expansion of macro 'addbyte' 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1418:25: note: in expansion of macro 'addbyte' 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1521:17: note: in expansion of macro 'addbyte' 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1521:17: note: in expansion of macro 'addbyte' 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1548:25: note: in expansion of macro 'addbyte' 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1574:17: note: in expansion of macro 'addbyte' 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1610:25: note: in expansion of macro 'addbyte' 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1701:17: note: in expansion of macro 'addbyte' 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1701:17: note: in expansion of macro 'addbyte' 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1717:17: note: in expansion of macro 'addbyte' 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1717:17: note: in expansion of macro 'addbyte' 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1790:17: note: in expansion of macro 'addbyte' 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1887:25: note: in expansion of macro 'addbyte' 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:1887:25: note: in expansion of macro 'addbyte' 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2067:17: note: in expansion of macro 'addbyte' 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2116:25: note: in expansion of macro 'addbyte' 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2130:17: note: in expansion of macro 'addbyte' 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2137:17: note: in expansion of macro 'addbyte' 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2156:17: note: in expansion of macro 'addbyte' 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2256:17: note: in expansion of macro 'addbyte' 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2256:17: note: in expansion of macro 'addbyte' 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2286:17: note: in expansion of macro 'addbyte' 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2292:9: note: in expansion of macro 'addbyte' 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2356:25: note: in expansion of macro 'addbyte' 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2456:25: note: in expansion of macro 'addbyte' 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:2937:9: note: in expansion of macro 'addbyte' 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2938 | addbyte(0x97); | ~~~~~~~~~~~~~~ 2939 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2940 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2941 | else | ~~~~ 2942 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2943 | | 2944 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2946 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2947 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2948 | | 2949 | if (params->fbzMode & FBZ_RGB_WMASK) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2950 | { | ~ 2951 | if (dither) | ~~~~~~~~~~~ 2952 | { | ~ 2953 | addbyte(0x49); /*MOV R8, dither_rb*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2955 | addquad(dither2x2 ? (uintptr_t)dither_rb2x2 : (uintptr_t)dither_rb); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2956 | addbyte(0x4c); /*MOV ESI, real_y (R14)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2957 | addbyte(0x89); | ~~~~~~~~~~~~~~ 2958 | addbyte(0xf6); | ~~~~~~~~~~~~~~ 2959 | addbyte(0x0f); /*MOVZX EBX, AH*/ /*G*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2960 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2961 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2962 | if (dither2x2) | ~~~~~~~~~~~~~~ 2963 | { | ~ 2964 | addbyte(0x83); /*AND EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2965 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2966 | addbyte(1); | ~~~~~~~~~~~ 2967 | addbyte(0x83); /*AND ESI, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2969 | addbyte(1); | ~~~~~~~~~~~ 2970 | addbyte(0xc1); /*SHL EBX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2971 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2972 | addbyte(2); | ~~~~~~~~~~~ 2973 | } | ~ 2974 | else | ~~~~ 2975 | { | ~ 2976 | addbyte(0x83); /*AND EDX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2978 | addbyte(3); | ~~~~~~~~~~~ 2979 | addbyte(0x83); /*AND ESI, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2981 | addbyte(3); | ~~~~~~~~~~~ 2982 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2984 | addbyte(4); | ~~~~~~~~~~~ 2985 | } | ~ 2986 | addbyte(0x0f); /*MOVZX ECX, AL*/ /*R*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2988 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2989 | if (dither2x2) | ~~~~~~~~~~~~~~ 2990 | { | ~ 2991 | addbyte(0xc1); /*SHR EAX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2992 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2993 | addbyte(14); | ~~~~~~~~~~~~ 2994 | addbyte(0x8d); /*LEA ESI, RDX+RSI*2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | addbyte(0x34); | ~~~~~~~~~~~~~~ 2996 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2997 | } | ~ 2998 | else | ~~~~ 2999 | { | ~ 3000 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3001 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3002 | addbyte(12); | ~~~~~~~~~~~~ 3003 | addbyte(0x8d); /*LEA ESI, RDX+RSI*4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3004 | addbyte(0x34); | ~~~~~~~~~~~~~~ 3005 | addbyte(0xb2); | ~~~~~~~~~~~~~~ 3006 | } | ~ 3007 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3008 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3009 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3010 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3011 | else | ~~~~ 3012 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3013 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3014 | addbyte(0x01); | ~~~~~~~~~~~~~~ 3015 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 3016 | if (dither2x2) | ~~~~~~~~~~~~~~ 3017 | { | ~ 3018 | addbyte(0xc1); /*SHL ECX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3019 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3020 | addbyte(2); | ~~~~~~~~~~~ 3021 | addbyte(0x25); /*AND EAX, 0x3fc*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | addlong(0x3fc); | ~~~~~~~~~~~~~~~ 3023 | } | ~ 3024 | else | ~~~~ 3025 | { | ~ 3026 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3027 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3028 | addbyte(4); | ~~~~~~~~~~~ 3029 | addbyte(0x25); /*AND EAX, 0xff0*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | addlong(0xff0); | ~~~~~~~~~~~~~~~ 3031 | } | ~ 3032 | addbyte(0x0f); /*MOVZX EBX, dither_g[EBX+ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3033 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3034 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 3035 | addbyte(0x1e); | ~~~~~~~~~~~~~~ 3036 | addlong(dither2x2 ? ((uintptr_t)dither_g2x2 - (uintptr_t)dither_rb2x2) : ((uintptr_t)dither_g - (uintptr_t)dither_rb)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3037 | addbyte(0x0f); /*MOVZX ECX, dither_rb[RCX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3038 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3039 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 3040 | addbyte(0x0e); | ~~~~~~~~~~~~~~ 3041 | addbyte(0x0f); /*MOVZX EAX, dither_rb[RAX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3042 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3043 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3044 | addbyte(0x06); | ~~~~~~~~~~~~~~ 3045 | addbyte(0xc1); /*SHL EBX, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3046 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3047 | addbyte(5); | ~~~~~~~~~~~ 3048 | addbyte(0xc1); /*SHL EAX, 11*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3049 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3050 | addbyte(11); | ~~~~~~~~~~~~ 3051 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3052 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3053 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3054 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3055 | } | ~ 3056 | else | ~~~~ 3057 | { | ~ 3058 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3059 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 3060 | addbyte(0x0f); /*MOVZX ECX, AH*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3061 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3062 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 3063 | addbyte(0xc1); /*SHR EAX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3064 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3065 | addbyte(3); | ~~~~~~~~~~~ 3066 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3067 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 3068 | addbyte(8); | ~~~~~~~~~~~ 3069 | addbyte(0xc1); /*SHL ECX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3070 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3071 | addbyte(3); | ~~~~~~~~~~~ 3072 | addbyte(0x81); /*AND EAX, 0x001f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3073 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3074 | addlong(0x001f); | ~~~~~~~~~~~~~~~~ 3075 | addbyte(0x81); /*AND EBX, 0xf800*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3076 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3077 | addlong(0xf800); | ~~~~~~~~~~~~~~~~ 3078 | addbyte(0x81); /*AND ECX, 0x07e0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3079 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3080 | addlong(0x07e0); | ~~~~~~~~~~~~~~~~ 3081 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3082 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3083 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3084 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3085 | } | ~ 3086 | addbyte(0x48); /*MOV RSI, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3087 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3088 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3089 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3092 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3093 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3094 | } | ~ 3095 | | 3096 | if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | { | ~ 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:3098:17: note: in expansion of macro 'addbyte' 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2938 | addbyte(0x97); | ~~~~~~~~~~~~~~ 2939 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2940 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2941 | else | ~~~~ 2942 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2943 | | 2944 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2946 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2947 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2948 | | 2949 | if (params->fbzMode & FBZ_RGB_WMASK) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2950 | { | ~ 2951 | if (dither) | ~~~~~~~~~~~ 2952 | { | ~ 2953 | addbyte(0x49); /*MOV R8, dither_rb*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2955 | addquad(dither2x2 ? (uintptr_t)dither_rb2x2 : (uintptr_t)dither_rb); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2956 | addbyte(0x4c); /*MOV ESI, real_y (R14)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2957 | addbyte(0x89); | ~~~~~~~~~~~~~~ 2958 | addbyte(0xf6); | ~~~~~~~~~~~~~~ 2959 | addbyte(0x0f); /*MOVZX EBX, AH*/ /*G*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2960 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2961 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2962 | if (dither2x2) | ~~~~~~~~~~~~~~ 2963 | { | ~ 2964 | addbyte(0x83); /*AND EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2965 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2966 | addbyte(1); | ~~~~~~~~~~~ 2967 | addbyte(0x83); /*AND ESI, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2969 | addbyte(1); | ~~~~~~~~~~~ 2970 | addbyte(0xc1); /*SHL EBX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2971 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2972 | addbyte(2); | ~~~~~~~~~~~ 2973 | } | ~ 2974 | else | ~~~~ 2975 | { | ~ 2976 | addbyte(0x83); /*AND EDX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2978 | addbyte(3); | ~~~~~~~~~~~ 2979 | addbyte(0x83); /*AND ESI, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2981 | addbyte(3); | ~~~~~~~~~~~ 2982 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2984 | addbyte(4); | ~~~~~~~~~~~ 2985 | } | ~ 2986 | addbyte(0x0f); /*MOVZX ECX, AL*/ /*R*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2988 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2989 | if (dither2x2) | ~~~~~~~~~~~~~~ 2990 | { | ~ 2991 | addbyte(0xc1); /*SHR EAX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2992 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2993 | addbyte(14); | ~~~~~~~~~~~~ 2994 | addbyte(0x8d); /*LEA ESI, RDX+RSI*2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | addbyte(0x34); | ~~~~~~~~~~~~~~ 2996 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2997 | } | ~ 2998 | else | ~~~~ 2999 | { | ~ 3000 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3001 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3002 | addbyte(12); | ~~~~~~~~~~~~ 3003 | addbyte(0x8d); /*LEA ESI, RDX+RSI*4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3004 | addbyte(0x34); | ~~~~~~~~~~~~~~ 3005 | addbyte(0xb2); | ~~~~~~~~~~~~~~ 3006 | } | ~ 3007 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3008 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3009 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3010 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3011 | else | ~~~~ 3012 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3013 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3014 | addbyte(0x01); | ~~~~~~~~~~~~~~ 3015 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 3016 | if (dither2x2) | ~~~~~~~~~~~~~~ 3017 | { | ~ 3018 | addbyte(0xc1); /*SHL ECX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3019 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3020 | addbyte(2); | ~~~~~~~~~~~ 3021 | addbyte(0x25); /*AND EAX, 0x3fc*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | addlong(0x3fc); | ~~~~~~~~~~~~~~~ 3023 | } | ~ 3024 | else | ~~~~ 3025 | { | ~ 3026 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3027 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3028 | addbyte(4); | ~~~~~~~~~~~ 3029 | addbyte(0x25); /*AND EAX, 0xff0*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | addlong(0xff0); | ~~~~~~~~~~~~~~~ 3031 | } | ~ 3032 | addbyte(0x0f); /*MOVZX EBX, dither_g[EBX+ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3033 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3034 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 3035 | addbyte(0x1e); | ~~~~~~~~~~~~~~ 3036 | addlong(dither2x2 ? ((uintptr_t)dither_g2x2 - (uintptr_t)dither_rb2x2) : ((uintptr_t)dither_g - (uintptr_t)dither_rb)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3037 | addbyte(0x0f); /*MOVZX ECX, dither_rb[RCX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3038 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3039 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 3040 | addbyte(0x0e); | ~~~~~~~~~~~~~~ 3041 | addbyte(0x0f); /*MOVZX EAX, dither_rb[RAX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3042 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3043 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3044 | addbyte(0x06); | ~~~~~~~~~~~~~~ 3045 | addbyte(0xc1); /*SHL EBX, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3046 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3047 | addbyte(5); | ~~~~~~~~~~~ 3048 | addbyte(0xc1); /*SHL EAX, 11*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3049 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3050 | addbyte(11); | ~~~~~~~~~~~~ 3051 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3052 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3053 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3054 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3055 | } | ~ 3056 | else | ~~~~ 3057 | { | ~ 3058 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3059 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 3060 | addbyte(0x0f); /*MOVZX ECX, AH*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3061 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3062 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 3063 | addbyte(0xc1); /*SHR EAX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3064 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3065 | addbyte(3); | ~~~~~~~~~~~ 3066 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3067 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 3068 | addbyte(8); | ~~~~~~~~~~~ 3069 | addbyte(0xc1); /*SHL ECX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3070 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3071 | addbyte(3); | ~~~~~~~~~~~ 3072 | addbyte(0x81); /*AND EAX, 0x001f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3073 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3074 | addlong(0x001f); | ~~~~~~~~~~~~~~~~ 3075 | addbyte(0x81); /*AND EBX, 0xf800*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3076 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3077 | addlong(0xf800); | ~~~~~~~~~~~~~~~~ 3078 | addbyte(0x81); /*AND ECX, 0x07e0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3079 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3080 | addlong(0x07e0); | ~~~~~~~~~~~~~~~~ 3081 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3082 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3083 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3084 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3085 | } | ~ 3086 | addbyte(0x48); /*MOV RSI, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3087 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3088 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3089 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3092 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3093 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3094 | } | ~ 3095 | | 3096 | if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | { | ~ 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3099 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3100 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3101 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3102 | else | ~~~~ 3103 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3104 | addbyte(0x66); /*MOV AX, new_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3105 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3106 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3107 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3108 | addbyte(0x48); /*MOV RSI, aux_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3109 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3110 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3111 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3112 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3113 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3114 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3115 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3116 | } | ~ 3117 | | 3118 | if (z_skip_pos) | ~~~~~~~~~~~~~~~ 3119 | *(uint32_t *)&code_block[z_skip_pos] = (block_pos - z_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3120 | if (a_skip_pos) | ~~~~~~~~~~~~~~~ 3121 | *(uint32_t *)&code_block[a_skip_pos] = (block_pos - a_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3122 | if (chroma_skip_pos) | ~~~~~~~~~~~~~~~~~~~~ 3123 | *(uint32_t *)&code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3124 | | 3125 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3126 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3127 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3128 | | 3129 | addbyte(0xf3); /*MOVDQU XMM1, state->ib[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3130 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3131 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3132 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3133 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3134 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu0_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3135 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3136 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3137 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3138 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3139 | addbyte(0xf3); /*MOVQ XMM4, state->tmu0_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3141 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3142 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3143 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3144 | addbyte(0xf3); /*MOVDQU XMM0, params->dBdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3145 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3146 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3147 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3148 | addlong(offsetof(voodoo_params_t, dBdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3149 | addbyte(0x8b); /*MOV EAX, params->dZdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3150 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3151 | addlong(offsetof(voodoo_params_t, dZdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3152 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[0].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3153 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3154 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3155 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3156 | addlong(offsetof(voodoo_params_t, tmu[0].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3157 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[0].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3158 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3159 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3160 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3161 | addlong(offsetof(voodoo_params_t, tmu[0].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3162 | | 3163 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3164 | { | ~ 3165 | addbyte(0x66); /*PADDD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3166 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3167 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3168 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3169 | } | ~ 3170 | else | ~~~~ 3171 | { | ~ 3172 | addbyte(0x66); /*PSUBD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3173 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3174 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 3175 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3176 | } | ~ 3177 | | 3178 | addbyte(0xf3); /*MOVQ XMM0, state->w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3179 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3180 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3181 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3182 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3183 | addbyte(0xf3); /*MOVDQU state->ib, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3184 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3185 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3186 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3187 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3188 | addbyte(0xf3); /*MOVQ XMM7, params->dWdX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3191 | addbyte(0xbe); | ~~~~~~~~~~~~~~ 3192 | addlong(offsetof(voodoo_params_t, dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3193 | | 3194 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3195 | { | ~ 3196 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3198 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3199 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3200 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3202 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3203 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3204 | addbyte(0x66); /*PADDQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3205 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3206 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3207 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3208 | addbyte(0x01); /*ADD state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3209 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3210 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3211 | } | ~ 3212 | else | ~~~~ 3213 | { | ~ 3214 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3216 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3217 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3218 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3219 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3220 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3221 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3222 | addbyte(0x66); /*PSUBQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3224 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3225 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3226 | addbyte(0x29); /*SUB state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3227 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3228 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3229 | } | ~ 3230 | | 3231 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3232 | { | ~ 3233 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[1].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3234 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3235 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3236 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3237 | addlong(offsetof(voodoo_params_t, tmu[1].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3238 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[1].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3241 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3242 | addlong(offsetof(voodoo_params_t, tmu[1].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3243 | } | ~ 3244 | | 3245 | addbyte(0xf3); /*MOVDQU state->tmu0_s, XMM3*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:3245:9: note: in expansion of macro 'addbyte' 3245 | addbyte(0xf3); /*MOVDQU state->tmu0_s, XMM3*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2938 | addbyte(0x97); | ~~~~~~~~~~~~~~ 2939 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2940 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2941 | else | ~~~~ 2942 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2943 | | 2944 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2946 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2947 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2948 | | 2949 | if (params->fbzMode & FBZ_RGB_WMASK) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2950 | { | ~ 2951 | if (dither) | ~~~~~~~~~~~ 2952 | { | ~ 2953 | addbyte(0x49); /*MOV R8, dither_rb*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2955 | addquad(dither2x2 ? (uintptr_t)dither_rb2x2 : (uintptr_t)dither_rb); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2956 | addbyte(0x4c); /*MOV ESI, real_y (R14)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2957 | addbyte(0x89); | ~~~~~~~~~~~~~~ 2958 | addbyte(0xf6); | ~~~~~~~~~~~~~~ 2959 | addbyte(0x0f); /*MOVZX EBX, AH*/ /*G*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2960 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2961 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2962 | if (dither2x2) | ~~~~~~~~~~~~~~ 2963 | { | ~ 2964 | addbyte(0x83); /*AND EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2965 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2966 | addbyte(1); | ~~~~~~~~~~~ 2967 | addbyte(0x83); /*AND ESI, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2969 | addbyte(1); | ~~~~~~~~~~~ 2970 | addbyte(0xc1); /*SHL EBX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2971 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2972 | addbyte(2); | ~~~~~~~~~~~ 2973 | } | ~ 2974 | else | ~~~~ 2975 | { | ~ 2976 | addbyte(0x83); /*AND EDX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2978 | addbyte(3); | ~~~~~~~~~~~ 2979 | addbyte(0x83); /*AND ESI, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2981 | addbyte(3); | ~~~~~~~~~~~ 2982 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2984 | addbyte(4); | ~~~~~~~~~~~ 2985 | } | ~ 2986 | addbyte(0x0f); /*MOVZX ECX, AL*/ /*R*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2988 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2989 | if (dither2x2) | ~~~~~~~~~~~~~~ 2990 | { | ~ 2991 | addbyte(0xc1); /*SHR EAX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2992 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2993 | addbyte(14); | ~~~~~~~~~~~~ 2994 | addbyte(0x8d); /*LEA ESI, RDX+RSI*2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | addbyte(0x34); | ~~~~~~~~~~~~~~ 2996 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2997 | } | ~ 2998 | else | ~~~~ 2999 | { | ~ 3000 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3001 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3002 | addbyte(12); | ~~~~~~~~~~~~ 3003 | addbyte(0x8d); /*LEA ESI, RDX+RSI*4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3004 | addbyte(0x34); | ~~~~~~~~~~~~~~ 3005 | addbyte(0xb2); | ~~~~~~~~~~~~~~ 3006 | } | ~ 3007 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3008 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3009 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3010 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3011 | else | ~~~~ 3012 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3013 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3014 | addbyte(0x01); | ~~~~~~~~~~~~~~ 3015 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 3016 | if (dither2x2) | ~~~~~~~~~~~~~~ 3017 | { | ~ 3018 | addbyte(0xc1); /*SHL ECX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3019 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3020 | addbyte(2); | ~~~~~~~~~~~ 3021 | addbyte(0x25); /*AND EAX, 0x3fc*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | addlong(0x3fc); | ~~~~~~~~~~~~~~~ 3023 | } | ~ 3024 | else | ~~~~ 3025 | { | ~ 3026 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3027 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3028 | addbyte(4); | ~~~~~~~~~~~ 3029 | addbyte(0x25); /*AND EAX, 0xff0*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | addlong(0xff0); | ~~~~~~~~~~~~~~~ 3031 | } | ~ 3032 | addbyte(0x0f); /*MOVZX EBX, dither_g[EBX+ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3033 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3034 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 3035 | addbyte(0x1e); | ~~~~~~~~~~~~~~ 3036 | addlong(dither2x2 ? ((uintptr_t)dither_g2x2 - (uintptr_t)dither_rb2x2) : ((uintptr_t)dither_g - (uintptr_t)dither_rb)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3037 | addbyte(0x0f); /*MOVZX ECX, dither_rb[RCX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3038 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3039 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 3040 | addbyte(0x0e); | ~~~~~~~~~~~~~~ 3041 | addbyte(0x0f); /*MOVZX EAX, dither_rb[RAX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3042 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3043 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3044 | addbyte(0x06); | ~~~~~~~~~~~~~~ 3045 | addbyte(0xc1); /*SHL EBX, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3046 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3047 | addbyte(5); | ~~~~~~~~~~~ 3048 | addbyte(0xc1); /*SHL EAX, 11*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3049 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3050 | addbyte(11); | ~~~~~~~~~~~~ 3051 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3052 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3053 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3054 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3055 | } | ~ 3056 | else | ~~~~ 3057 | { | ~ 3058 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3059 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 3060 | addbyte(0x0f); /*MOVZX ECX, AH*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3061 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3062 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 3063 | addbyte(0xc1); /*SHR EAX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3064 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3065 | addbyte(3); | ~~~~~~~~~~~ 3066 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3067 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 3068 | addbyte(8); | ~~~~~~~~~~~ 3069 | addbyte(0xc1); /*SHL ECX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3070 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3071 | addbyte(3); | ~~~~~~~~~~~ 3072 | addbyte(0x81); /*AND EAX, 0x001f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3073 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3074 | addlong(0x001f); | ~~~~~~~~~~~~~~~~ 3075 | addbyte(0x81); /*AND EBX, 0xf800*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3076 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3077 | addlong(0xf800); | ~~~~~~~~~~~~~~~~ 3078 | addbyte(0x81); /*AND ECX, 0x07e0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3079 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3080 | addlong(0x07e0); | ~~~~~~~~~~~~~~~~ 3081 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3082 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3083 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3084 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3085 | } | ~ 3086 | addbyte(0x48); /*MOV RSI, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3087 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3088 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3089 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3092 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3093 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3094 | } | ~ 3095 | | 3096 | if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | { | ~ 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3099 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3100 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3101 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3102 | else | ~~~~ 3103 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3104 | addbyte(0x66); /*MOV AX, new_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3105 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3106 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3107 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3108 | addbyte(0x48); /*MOV RSI, aux_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3109 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3110 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3111 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3112 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3113 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3114 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3115 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3116 | } | ~ 3117 | | 3118 | if (z_skip_pos) | ~~~~~~~~~~~~~~~ 3119 | *(uint32_t *)&code_block[z_skip_pos] = (block_pos - z_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3120 | if (a_skip_pos) | ~~~~~~~~~~~~~~~ 3121 | *(uint32_t *)&code_block[a_skip_pos] = (block_pos - a_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3122 | if (chroma_skip_pos) | ~~~~~~~~~~~~~~~~~~~~ 3123 | *(uint32_t *)&code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3124 | | 3125 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3126 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3127 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3128 | | 3129 | addbyte(0xf3); /*MOVDQU XMM1, state->ib[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3130 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3131 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3132 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3133 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3134 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu0_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3135 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3136 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3137 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3138 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3139 | addbyte(0xf3); /*MOVQ XMM4, state->tmu0_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3141 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3142 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3143 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3144 | addbyte(0xf3); /*MOVDQU XMM0, params->dBdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3145 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3146 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3147 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3148 | addlong(offsetof(voodoo_params_t, dBdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3149 | addbyte(0x8b); /*MOV EAX, params->dZdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3150 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3151 | addlong(offsetof(voodoo_params_t, dZdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3152 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[0].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3153 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3154 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3155 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3156 | addlong(offsetof(voodoo_params_t, tmu[0].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3157 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[0].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3158 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3159 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3160 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3161 | addlong(offsetof(voodoo_params_t, tmu[0].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3162 | | 3163 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3164 | { | ~ 3165 | addbyte(0x66); /*PADDD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3166 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3167 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3168 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3169 | } | ~ 3170 | else | ~~~~ 3171 | { | ~ 3172 | addbyte(0x66); /*PSUBD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3173 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3174 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 3175 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3176 | } | ~ 3177 | | 3178 | addbyte(0xf3); /*MOVQ XMM0, state->w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3179 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3180 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3181 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3182 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3183 | addbyte(0xf3); /*MOVDQU state->ib, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3184 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3185 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3186 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3187 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3188 | addbyte(0xf3); /*MOVQ XMM7, params->dWdX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3191 | addbyte(0xbe); | ~~~~~~~~~~~~~~ 3192 | addlong(offsetof(voodoo_params_t, dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3193 | | 3194 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3195 | { | ~ 3196 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3198 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3199 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3200 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3202 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3203 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3204 | addbyte(0x66); /*PADDQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3205 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3206 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3207 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3208 | addbyte(0x01); /*ADD state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3209 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3210 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3211 | } | ~ 3212 | else | ~~~~ 3213 | { | ~ 3214 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3216 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3217 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3218 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3219 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3220 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3221 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3222 | addbyte(0x66); /*PSUBQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3224 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3225 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3226 | addbyte(0x29); /*SUB state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3227 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3228 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3229 | } | ~ 3230 | | 3231 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3232 | { | ~ 3233 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[1].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3234 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3235 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3236 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3237 | addlong(offsetof(voodoo_params_t, tmu[1].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3238 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[1].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3241 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3242 | addlong(offsetof(voodoo_params_t, tmu[1].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3243 | } | ~ 3244 | | 3245 | addbyte(0xf3); /*MOVDQU state->tmu0_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3246 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3247 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3248 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3249 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3250 | addbyte(0x66); /*MOVQ state->tmu0_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3251 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3252 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3253 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3254 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3255 | addbyte(0x66); /*MOVQ state->w, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3256 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3257 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3258 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3259 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3260 | | 3261 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3262 | { | ~ 3263 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu1_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3264 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3265 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3266 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3267 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3268 | addbyte(0xf3); /*MOVQ XMM4, state->tmu1_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3269 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3270 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3271 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3272 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3273 | | 3274 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3275 | { | ~ 3276 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3277 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3278 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3279 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3280 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3281 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3282 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3283 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3284 | } | ~ 3285 | else | ~~~~ 3286 | { | ~ 3287 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3288 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3290 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3291 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3292 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3293 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3294 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3295 | } | ~ 3296 | | 3297 | addbyte(0xf3); /*MOVDQU state->tmu1_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3298 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3299 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3300 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3301 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3302 | addbyte(0x66); /*MOVQ state->tmu1_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3303 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3304 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3305 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3306 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3307 | } | ~ 3308 | | 3309 | addbyte(0x83); /*ADD state->pixel_count[EDI], 1*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:3309:9: note: in expansion of macro 'addbyte' 3309 | addbyte(0x83); /*ADD state->pixel_count[EDI], 1*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2938 | addbyte(0x97); | ~~~~~~~~~~~~~~ 2939 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2940 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2941 | else | ~~~~ 2942 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2943 | | 2944 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2946 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2947 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2948 | | 2949 | if (params->fbzMode & FBZ_RGB_WMASK) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2950 | { | ~ 2951 | if (dither) | ~~~~~~~~~~~ 2952 | { | ~ 2953 | addbyte(0x49); /*MOV R8, dither_rb*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2955 | addquad(dither2x2 ? (uintptr_t)dither_rb2x2 : (uintptr_t)dither_rb); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2956 | addbyte(0x4c); /*MOV ESI, real_y (R14)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2957 | addbyte(0x89); | ~~~~~~~~~~~~~~ 2958 | addbyte(0xf6); | ~~~~~~~~~~~~~~ 2959 | addbyte(0x0f); /*MOVZX EBX, AH*/ /*G*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2960 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2961 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2962 | if (dither2x2) | ~~~~~~~~~~~~~~ 2963 | { | ~ 2964 | addbyte(0x83); /*AND EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2965 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2966 | addbyte(1); | ~~~~~~~~~~~ 2967 | addbyte(0x83); /*AND ESI, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2969 | addbyte(1); | ~~~~~~~~~~~ 2970 | addbyte(0xc1); /*SHL EBX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2971 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2972 | addbyte(2); | ~~~~~~~~~~~ 2973 | } | ~ 2974 | else | ~~~~ 2975 | { | ~ 2976 | addbyte(0x83); /*AND EDX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2978 | addbyte(3); | ~~~~~~~~~~~ 2979 | addbyte(0x83); /*AND ESI, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2981 | addbyte(3); | ~~~~~~~~~~~ 2982 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2984 | addbyte(4); | ~~~~~~~~~~~ 2985 | } | ~ 2986 | addbyte(0x0f); /*MOVZX ECX, AL*/ /*R*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2988 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2989 | if (dither2x2) | ~~~~~~~~~~~~~~ 2990 | { | ~ 2991 | addbyte(0xc1); /*SHR EAX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2992 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2993 | addbyte(14); | ~~~~~~~~~~~~ 2994 | addbyte(0x8d); /*LEA ESI, RDX+RSI*2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | addbyte(0x34); | ~~~~~~~~~~~~~~ 2996 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2997 | } | ~ 2998 | else | ~~~~ 2999 | { | ~ 3000 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3001 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3002 | addbyte(12); | ~~~~~~~~~~~~ 3003 | addbyte(0x8d); /*LEA ESI, RDX+RSI*4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3004 | addbyte(0x34); | ~~~~~~~~~~~~~~ 3005 | addbyte(0xb2); | ~~~~~~~~~~~~~~ 3006 | } | ~ 3007 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3008 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3009 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3010 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3011 | else | ~~~~ 3012 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3013 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3014 | addbyte(0x01); | ~~~~~~~~~~~~~~ 3015 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 3016 | if (dither2x2) | ~~~~~~~~~~~~~~ 3017 | { | ~ 3018 | addbyte(0xc1); /*SHL ECX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3019 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3020 | addbyte(2); | ~~~~~~~~~~~ 3021 | addbyte(0x25); /*AND EAX, 0x3fc*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | addlong(0x3fc); | ~~~~~~~~~~~~~~~ 3023 | } | ~ 3024 | else | ~~~~ 3025 | { | ~ 3026 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3027 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3028 | addbyte(4); | ~~~~~~~~~~~ 3029 | addbyte(0x25); /*AND EAX, 0xff0*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | addlong(0xff0); | ~~~~~~~~~~~~~~~ 3031 | } | ~ 3032 | addbyte(0x0f); /*MOVZX EBX, dither_g[EBX+ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3033 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3034 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 3035 | addbyte(0x1e); | ~~~~~~~~~~~~~~ 3036 | addlong(dither2x2 ? ((uintptr_t)dither_g2x2 - (uintptr_t)dither_rb2x2) : ((uintptr_t)dither_g - (uintptr_t)dither_rb)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3037 | addbyte(0x0f); /*MOVZX ECX, dither_rb[RCX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3038 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3039 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 3040 | addbyte(0x0e); | ~~~~~~~~~~~~~~ 3041 | addbyte(0x0f); /*MOVZX EAX, dither_rb[RAX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3042 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3043 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3044 | addbyte(0x06); | ~~~~~~~~~~~~~~ 3045 | addbyte(0xc1); /*SHL EBX, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3046 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3047 | addbyte(5); | ~~~~~~~~~~~ 3048 | addbyte(0xc1); /*SHL EAX, 11*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3049 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3050 | addbyte(11); | ~~~~~~~~~~~~ 3051 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3052 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3053 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3054 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3055 | } | ~ 3056 | else | ~~~~ 3057 | { | ~ 3058 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3059 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 3060 | addbyte(0x0f); /*MOVZX ECX, AH*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3061 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3062 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 3063 | addbyte(0xc1); /*SHR EAX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3064 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3065 | addbyte(3); | ~~~~~~~~~~~ 3066 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3067 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 3068 | addbyte(8); | ~~~~~~~~~~~ 3069 | addbyte(0xc1); /*SHL ECX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3070 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3071 | addbyte(3); | ~~~~~~~~~~~ 3072 | addbyte(0x81); /*AND EAX, 0x001f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3073 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3074 | addlong(0x001f); | ~~~~~~~~~~~~~~~~ 3075 | addbyte(0x81); /*AND EBX, 0xf800*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3076 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3077 | addlong(0xf800); | ~~~~~~~~~~~~~~~~ 3078 | addbyte(0x81); /*AND ECX, 0x07e0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3079 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3080 | addlong(0x07e0); | ~~~~~~~~~~~~~~~~ 3081 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3082 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3083 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3084 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3085 | } | ~ 3086 | addbyte(0x48); /*MOV RSI, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3087 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3088 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3089 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3092 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3093 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3094 | } | ~ 3095 | | 3096 | if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | { | ~ 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3099 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3100 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3101 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3102 | else | ~~~~ 3103 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3104 | addbyte(0x66); /*MOV AX, new_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3105 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3106 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3107 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3108 | addbyte(0x48); /*MOV RSI, aux_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3109 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3110 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3111 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3112 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3113 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3114 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3115 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3116 | } | ~ 3117 | | 3118 | if (z_skip_pos) | ~~~~~~~~~~~~~~~ 3119 | *(uint32_t *)&code_block[z_skip_pos] = (block_pos - z_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3120 | if (a_skip_pos) | ~~~~~~~~~~~~~~~ 3121 | *(uint32_t *)&code_block[a_skip_pos] = (block_pos - a_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3122 | if (chroma_skip_pos) | ~~~~~~~~~~~~~~~~~~~~ 3123 | *(uint32_t *)&code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3124 | | 3125 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3126 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3127 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3128 | | 3129 | addbyte(0xf3); /*MOVDQU XMM1, state->ib[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3130 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3131 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3132 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3133 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3134 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu0_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3135 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3136 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3137 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3138 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3139 | addbyte(0xf3); /*MOVQ XMM4, state->tmu0_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3141 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3142 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3143 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3144 | addbyte(0xf3); /*MOVDQU XMM0, params->dBdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3145 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3146 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3147 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3148 | addlong(offsetof(voodoo_params_t, dBdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3149 | addbyte(0x8b); /*MOV EAX, params->dZdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3150 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3151 | addlong(offsetof(voodoo_params_t, dZdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3152 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[0].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3153 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3154 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3155 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3156 | addlong(offsetof(voodoo_params_t, tmu[0].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3157 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[0].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3158 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3159 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3160 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3161 | addlong(offsetof(voodoo_params_t, tmu[0].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3162 | | 3163 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3164 | { | ~ 3165 | addbyte(0x66); /*PADDD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3166 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3167 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3168 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3169 | } | ~ 3170 | else | ~~~~ 3171 | { | ~ 3172 | addbyte(0x66); /*PSUBD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3173 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3174 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 3175 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3176 | } | ~ 3177 | | 3178 | addbyte(0xf3); /*MOVQ XMM0, state->w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3179 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3180 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3181 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3182 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3183 | addbyte(0xf3); /*MOVDQU state->ib, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3184 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3185 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3186 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3187 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3188 | addbyte(0xf3); /*MOVQ XMM7, params->dWdX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3191 | addbyte(0xbe); | ~~~~~~~~~~~~~~ 3192 | addlong(offsetof(voodoo_params_t, dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3193 | | 3194 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3195 | { | ~ 3196 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3198 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3199 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3200 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3202 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3203 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3204 | addbyte(0x66); /*PADDQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3205 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3206 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3207 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3208 | addbyte(0x01); /*ADD state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3209 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3210 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3211 | } | ~ 3212 | else | ~~~~ 3213 | { | ~ 3214 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3216 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3217 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3218 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3219 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3220 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3221 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3222 | addbyte(0x66); /*PSUBQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3224 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3225 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3226 | addbyte(0x29); /*SUB state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3227 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3228 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3229 | } | ~ 3230 | | 3231 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3232 | { | ~ 3233 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[1].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3234 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3235 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3236 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3237 | addlong(offsetof(voodoo_params_t, tmu[1].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3238 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[1].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3241 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3242 | addlong(offsetof(voodoo_params_t, tmu[1].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3243 | } | ~ 3244 | | 3245 | addbyte(0xf3); /*MOVDQU state->tmu0_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3246 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3247 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3248 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3249 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3250 | addbyte(0x66); /*MOVQ state->tmu0_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3251 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3252 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3253 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3254 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3255 | addbyte(0x66); /*MOVQ state->w, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3256 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3257 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3258 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3259 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3260 | | 3261 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3262 | { | ~ 3263 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu1_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3264 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3265 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3266 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3267 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3268 | addbyte(0xf3); /*MOVQ XMM4, state->tmu1_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3269 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3270 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3271 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3272 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3273 | | 3274 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3275 | { | ~ 3276 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3277 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3278 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3279 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3280 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3281 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3282 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3283 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3284 | } | ~ 3285 | else | ~~~~ 3286 | { | ~ 3287 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3288 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3290 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3291 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3292 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3293 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3294 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3295 | } | ~ 3296 | | 3297 | addbyte(0xf3); /*MOVDQU state->tmu1_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3298 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3299 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3300 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3301 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3302 | addbyte(0x66); /*MOVQ state->tmu1_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3303 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3304 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3305 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3306 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3307 | } | ~ 3308 | | 3309 | addbyte(0x83); /*ADD state->pixel_count[EDI], 1*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:3309:9: note: in expansion of macro 'addbyte' 3309 | addbyte(0x83); /*ADD state->pixel_count[EDI], 1*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ In function 'voodoo_generate', inlined from 'voodoo_get_block' at vid_voodoo_codegen_x86-64.h:3408:9, inlined from 'voodoo_half_triangle' at vid_voodoo_render.c:776:31, inlined from 'voodoo_triangle' at vid_voodoo_render.c:1551:9: vid_voodoo_codegen_x86-64.h:47:41: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=] 47 | code_block[block_pos++] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 48 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 49 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 50 | } while (0) | ~~~~~~~~~~~ 51 | | 52 | #define addword(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 53 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 54 | *(uint16_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 55 | block_pos += 2; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 56 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 57 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 58 | } while (0) | ~~~~~~~~~~~ 59 | | 60 | #define addlong(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 61 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 62 | *(uint32_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 63 | block_pos += 4; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 64 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 65 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 66 | } while (0) | ~~~~~~~~~~~ 67 | | 68 | #define addquad(val) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 69 | do { \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 70 | *(uint64_t *)&code_block[block_pos] = val; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 71 | block_pos += 8; \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 72 | if (block_pos >= BLOCK_SIZE) \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 73 | fatal("Over!\n"); \ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 74 | } while (0) | ~~~~~~~~~~~ 75 | | 76 | | 77 | static __m128i xmm_01_w;// = 0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 78 | static __m128i xmm_ff_w;// = 0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 79 | static __m128i xmm_ff_b;// = 0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 80 | | 81 | static __m128i alookup[257], aminuslookup[256]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 82 | static __m128i minus_254;// = 0xff02ff02ff02ff02ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 83 | static __m128i bilinear_lookup[256*2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 84 | static __m128i xmm_00_ff_w[2]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 85 | static uint32_t i_00_ff_w[2] = {0, 0xff}; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 86 | | 87 | static inline int codegen_texture_fetch(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int block_pos, int tmu) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 88 | { | ~ 89 | if (params->textureMode[tmu] & 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 90 | { | ~ 91 | addbyte(0x48); /*MOV RBX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 92 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 93 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 94 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 95 | addbyte(0x48); /*MOV RAX, (1 << 48)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 96 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 97 | addquad(1ULL << 48); | ~~~~~~~~~~~~~~~~~~~~ 98 | addbyte(0x48); /*XOR RDX, RDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 99 | addbyte(0x31); | ~~~~~~~~~~~~~~ 100 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 101 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 102 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 103 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 104 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 105 | addbyte(0x48); /*CMP state->tmu_w, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 106 | addbyte(0x83); | ~~~~~~~~~~~~~~ 107 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 108 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 109 | addbyte(0); | ~~~~~~~~~~~ 110 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 111 | addbyte(7); | ~~~~~~~~~~~ 112 | addbyte(0x48); /*IDIV state->tmu_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 113 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 114 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 115 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_w) : offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 116 | addbyte(0x48); /*SAR RBX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 117 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 118 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 119 | addbyte(14); | ~~~~~~~~~~~~ 120 | addbyte(0x48); /*SAR RCX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 121 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 122 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 123 | addbyte(14); | ~~~~~~~~~~~~ 124 | addbyte(0x48); /*IMUL RBX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 125 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 126 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 127 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 128 | addbyte(0x48); /*IMUL RCX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 129 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 130 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 131 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 132 | addbyte(0x48); /*SAR RBX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 133 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 134 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 135 | addbyte(30); | ~~~~~~~~~~~~ 136 | addbyte(0x48); /*SAR RCX, 30*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 137 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 138 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 139 | addbyte(30); | ~~~~~~~~~~~~ 140 | addbyte(0x48); /*BSR EDX, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 141 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 142 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 143 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 144 | addbyte(0x48); /*SHL RAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 145 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 146 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 147 | addbyte(8); | ~~~~~~~~~~~ 148 | addbyte(0x89); /*MOV state->tex_t, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 149 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 150 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 151 | addbyte(0x89); /*MOV ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 152 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 153 | addbyte(0x83); /*SUB EDX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 154 | addbyte(0xea); | ~~~~~~~~~~~~~~ 155 | addbyte(19); | ~~~~~~~~~~~~ 156 | addbyte(0x48); /*SHR RAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 157 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 158 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 159 | addbyte(0xc1); /*SHL EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 160 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 161 | addbyte(8); | ~~~~~~~~~~~ 162 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 163 | addlong(0xff); | ~~~~~~~~~~~~~~ 164 | addbyte(0x89); /*MOV state->tex_s, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 165 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 166 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 167 | addbyte(0x41); /*MOVZX EAX, R9(logtable)[RAX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 168 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 169 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 170 | addbyte(0x04); | ~~~~~~~~~~~~~~ 171 | addbyte(0x01); | ~~~~~~~~~~~~~~ 172 | addbyte(0x09); /*OR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 173 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 174 | addbyte(0x03); /*ADD EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 175 | addbyte(0x87); | ~~~~~~~~~~~~~~ 176 | addlong(offsetof(voodoo_state_t, tmu[tmu].lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 177 | addbyte(0x3b); /*CMP EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 178 | addbyte(0x87); | ~~~~~~~~~~~~~~ 179 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 180 | addbyte(0x0f); /*CMOVL EAX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 181 | addbyte(0x4c); | ~~~~~~~~~~~~~~ 182 | addbyte(0x87); | ~~~~~~~~~~~~~~ 183 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 184 | addbyte(0x3b); /*CMP EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 185 | addbyte(0x87); | ~~~~~~~~~~~~~~ 186 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 187 | addbyte(0x0f); /*CMOVNL EAX, state->lod_max*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 188 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 189 | addbyte(0x87); | ~~~~~~~~~~~~~~ 190 | addlong(offsetof(voodoo_state_t, lod_max[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 191 | addbyte(0xc1); /*SHR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 192 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 193 | addbyte(8); | ~~~~~~~~~~~ 194 | addbyte(0x89); /*MOV state->lod, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 195 | addbyte(0x87); | ~~~~~~~~~~~~~~ 196 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 197 | } | ~ 198 | else | ~~~~ 199 | { | ~ 200 | addbyte(0x48); /*MOV RAX, state->tmu0_s*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 201 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 202 | addbyte(0x87); | ~~~~~~~~~~~~~~ 203 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_s) : offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 204 | addbyte(0x48); /*MOV RCX, state->tmu0_t*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 205 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 206 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 207 | addlong(tmu ? offsetof(voodoo_state_t, tmu1_t) : offsetof(voodoo_state_t, tmu0_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 208 | addbyte(0x48); /*SHR RAX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 209 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 210 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 211 | addbyte(28); | ~~~~~~~~~~~~ 212 | addbyte(0x8b); /*MOV EBX, state->lod_min*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 213 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 214 | addlong(offsetof(voodoo_state_t, lod_min[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 215 | addbyte(0x48); /*SHR RCX, 28*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 216 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 217 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 218 | addbyte(28); | ~~~~~~~~~~~~ 219 | addbyte(0x48); /*MOV state->tex_s, RAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 220 | addbyte(0x89); | ~~~~~~~~~~~~~~ 221 | addbyte(0x87); | ~~~~~~~~~~~~~~ 222 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 223 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 224 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 225 | addbyte(8); | ~~~~~~~~~~~ 226 | addbyte(0x48); /*MOV state->tex_t, RCX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 227 | addbyte(0x89); | ~~~~~~~~~~~~~~ 228 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 229 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 230 | addbyte(0x89); /*MOV state->lod, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 231 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 232 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 233 | } | ~ 234 | | 235 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 236 | { | ~ 237 | if (voodoo->bilinear_enabled && (params->textureMode[tmu] & 6)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 238 | { | ~ 239 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 240 | addbyte(8); | ~~~~~~~~~~~ 241 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 242 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 243 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 244 | addbyte(0xbd); /*MOV EBP, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 245 | addlong(1); | ~~~~~~~~~~~ 246 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 247 | addbyte(0xca); | ~~~~~~~~~~~~~~ 248 | // addbyte(0x8a); /*MOV DL, params->tex_shift[RSI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 249 | // addbyte(0x94); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 250 | // addbyte(0x8e); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 251 | // addlong(offsetof(voodoo_params_t, tex_shift)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 252 | addbyte(0xd3); /*SHL EBP, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 253 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 254 | addbyte(0x8b); /*MOV EAX, state->tex_s[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 255 | addbyte(0x87); | ~~~~~~~~~~~~~~ 256 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 | addbyte(0xc1); /*SHL EBP, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 258 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 259 | addbyte(3); | ~~~~~~~~~~~ 260 | addbyte(0x8b); /*MOV EBX, state->tex_t[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 261 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 262 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 263 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 264 | { | ~ 265 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 266 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 267 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 268 | addbyte(2); | ~~~~~~~~~~~ 269 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 270 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 271 | } | ~ 272 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 273 | { | ~ 274 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 275 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 276 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 277 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 278 | addbyte(2); | ~~~~~~~~~~~ 279 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 280 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 281 | } | ~ 282 | addbyte(0x29); /*SUB EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 283 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 284 | addbyte(0x29); /*SUB EBX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 285 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 286 | addbyte(0xd3); /*SAR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 287 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 288 | addbyte(0xd3); /*SAR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 290 | addbyte(0x89); /*MOV EBP, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 291 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 292 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 293 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 294 | addbyte(0x83); /*AND EBP, 0xf*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 295 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 296 | addbyte(0xf); | ~~~~~~~~~~~~~ 297 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 298 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 299 | addbyte(4); | ~~~~~~~~~~~ 300 | addbyte(0xc1); /*SAR EAX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 301 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 302 | addbyte(4); | ~~~~~~~~~~~ 303 | addbyte(0x81); /*AND ECX, 0xf0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 304 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 305 | addlong(0xf0); | ~~~~~~~~~~~~~~ 306 | addbyte(0xc1); /*SAR EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 307 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 308 | addbyte(4); | ~~~~~~~~~~~ 309 | addbyte(0x09); /*OR EBP, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 310 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 311 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 312 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 313 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 314 | addbyte(0xc1); /*SHL EBP, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 315 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 316 | addbyte(5); | ~~~~~~~~~~~ 317 | /*EAX = S, EBX = T, ECX = LOD, EDX = tex_shift, ESI=params, EDI=state, EBP = bilinear shift*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 318 | addbyte(0x48); /*LEA RSI, [RSI+RCX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 319 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 320 | addbyte(0x34); | ~~~~~~~~~~~~~~ 321 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 322 | addbyte(0x89); /*MOV ebp_store, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 323 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 324 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 325 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 326 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 327 | addbyte(0xac); | ~~~~~~~~~~~~~~ 328 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 329 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 330 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 331 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 332 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 333 | addbyte(0xda); | ~~~~~~~~~~~~~~ 334 | if (!state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 335 | { | ~ 336 | addbyte(0x23); /*AND EAX, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 337 | addbyte(0x86); | ~~~~~~~~~~~~~~ 338 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 339 | } | ~ 340 | addbyte(0x83); /*ADD EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 341 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 342 | addbyte(1); | ~~~~~~~~~~~ 343 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 344 | { | ~ 345 | addbyte(0x41); /*CMOVS EDX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 346 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 347 | addbyte(0x48); | ~~~~~~~~~~~~~~ 348 | addbyte(0x12); | ~~~~~~~~~~~~~~ 349 | addbyte(0x3b); /*CMP EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 350 | addbyte(0x96); | ~~~~~~~~~~~~~~ 351 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 352 | addbyte(0x0f); /*CMOVA EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 353 | addbyte(0x47); | ~~~~~~~~~~~~~~ 354 | addbyte(0x96); | ~~~~~~~~~~~~~~ 355 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 356 | addbyte(0x85); /*TEST EBX,EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 357 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 358 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 359 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 360 | addbyte(0x48); | ~~~~~~~~~~~~~~ 361 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 362 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 363 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 364 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 365 | addbyte(0x0f); /*CMOVA EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 366 | addbyte(0x47); | ~~~~~~~~~~~~~~ 367 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 368 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 369 | } | ~ 370 | else | ~~~~ 371 | { | ~ 372 | addbyte(0x23); /*AND EDX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 373 | addbyte(0x96); | ~~~~~~~~~~~~~~ 374 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 375 | addbyte(0x23); /*AND EBX, params->tex_h_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 376 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 377 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 378 | } | ~ 379 | /*EAX = S, EBX = T0, EDX = T1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 380 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 381 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 382 | addbyte(0xd3); /*SHL EDX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 383 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 384 | addbyte(0x48); /*LEA RBX,[RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 385 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 386 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 387 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 388 | addbyte(0); | ~~~~~~~~~~~ 389 | addbyte(0x48); /*LEA RDX,[RBP+RDX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 390 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 391 | addbyte(0x54); | ~~~~~~~~~~~~~~ 392 | addbyte(0x95); | ~~~~~~~~~~~~~~ 393 | addbyte(0); | ~~~~~~~~~~~ 394 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 395 | { | ~ 396 | addbyte(0x8b); /*MOV EBP, params->tex_w_mask[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 397 | addbyte(0xae); | ~~~~~~~~~~~~~~ 398 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 399 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 400 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 401 | addbyte(0x8b); /*MOV ebp_store2, RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 402 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 403 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 404 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 405 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 406 | addbyte(0x48); | ~~~~~~~~~~~~~~ 407 | addbyte(0x02); | ~~~~~~~~~~~~~~ 408 | addbyte(0x78); /*JS + - clamp on 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 409 | addbyte(2+3+2+ 5+5+2); | ~~~~~~~~~~~~~~~~~~~~~~ 410 | addbyte(0x3b); /*CMP EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 411 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 412 | addbyte(0x0f); /*CMOVAE EAX, EBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 413 | addbyte(0x43); | ~~~~~~~~~~~~~~ 414 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 415 | addbyte(0x73); /*JAE + - clamp on +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 416 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 417 | } | ~ 418 | else | ~~~~ 419 | { | ~ 420 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI] - is S at texture edge (ie will wrap/clamp)?*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 421 | addbyte(0x86); | ~~~~~~~~~~~~~~ 422 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 423 | addbyte(0x8b); /*MOV ebp_store2, ESI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 424 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 425 | addlong(offsetof(voodoo_state_t, ebp_store)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 426 | addbyte(0x74); /*JE +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 427 | addbyte(5+5+2); | ~~~~~~~~~~~~~~~ 428 | } | ~ 429 | | 430 | addbyte(0xf3); /*MOVQ XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 432 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 433 | addbyte(0x04); | ~~~~~~~~~~~~~~ 434 | addbyte(0x83); | ~~~~~~~~~~~~~~ 435 | addbyte(0xf3); /*MOVQ XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 436 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 437 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 438 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 439 | addbyte(0x82); | ~~~~~~~~~~~~~~ 440 | | 441 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 442 | { | ~ 443 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 444 | addbyte(5+5+4+4); | ~~~~~~~~~~~~~~~~~ 445 | | 446 | /*S clamped - the two S coordinates are the same*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 447 | addbyte(0x66); /*MOVD XMM0, [RBX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 448 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 449 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 450 | addbyte(0x04); | ~~~~~~~~~~~~~~ 451 | addbyte(0x83); | ~~~~~~~~~~~~~~ 452 | addbyte(0x66); /*MOVD XMM1, [RDX+RAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 453 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 454 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 455 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 456 | addbyte(0x82); | ~~~~~~~~~~~~~~ 457 | addbyte(0x66); /*PUNPCKLDQ XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 458 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 459 | addbyte(0x62); | ~~~~~~~~~~~~~~ 460 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 461 | addbyte(0x66); /*PUNPCKLDQ XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 462 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 463 | addbyte(0x62); | ~~~~~~~~~~~~~~ 464 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 465 | } | ~ 466 | else | ~~~~ 467 | { | ~ 468 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 469 | addbyte(5+5+5+5+6+6); | ~~~~~~~~~~~~~~~~~~~~~ 470 | | 471 | /*S wrapped - the two S coordinates are not contiguous*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 472 | addbyte(0x66); /*MOVD XMM0, [RBX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 473 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 474 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 475 | addbyte(0x04); | ~~~~~~~~~~~~~~ 476 | addbyte(0x83); | ~~~~~~~~~~~~~~ 477 | addbyte(0x66); /*MOVD XMM1, [RDX+EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 478 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 479 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 480 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 481 | addbyte(0x82); | ~~~~~~~~~~~~~~ 482 | addbyte(0x66); /*PINSRW XMM0, [RBX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 483 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 484 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 485 | addbyte(0x03); | ~~~~~~~~~~~~~~ 486 | addbyte(0x02); | ~~~~~~~~~~~~~~ 487 | addbyte(0x66); /*PINSRW XMM1, [RDX], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 488 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 489 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 490 | addbyte(0x0a); | ~~~~~~~~~~~~~~ 491 | addbyte(0x02); | ~~~~~~~~~~~~~~ 492 | addbyte(0x66); /*PINSRW XMM0, 2[RBX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 493 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 494 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 495 | addbyte(0x43); | ~~~~~~~~~~~~~~ 496 | addbyte(0x02); | ~~~~~~~~~~~~~~ 497 | addbyte(0x03); | ~~~~~~~~~~~~~~ 498 | addbyte(0x66); /*PINSRW XMM1, 2[RDX], 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 499 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 500 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 501 | addbyte(0x4a); | ~~~~~~~~~~~~~~ 502 | addbyte(0x02); | ~~~~~~~~~~~~~~ 503 | addbyte(0x03); | ~~~~~~~~~~~~~~ 504 | } | ~ 505 | | 506 | addbyte(0x49); /*MOV R8, bilinear_lookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 507 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 508 | addquad((uintptr_t)bilinear_lookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 509 | | 510 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 511 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 512 | addbyte(0x60); | ~~~~~~~~~~~~~~ 513 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 514 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 515 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 516 | addbyte(0x60); | ~~~~~~~~~~~~~~ 517 | addbyte(0xca); | ~~~~~~~~~~~~~~ 518 | | 519 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 520 | addbyte(0x01); | ~~~~~~~~~~~~~~ 521 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 522 | | 523 | addbyte(0x66); /*PMULLW XMM0, bilinear_lookup[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 525 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 526 | addbyte(0x06); | ~~~~~~~~~~~~~~ 527 | addbyte(0x66); /*PMULLW XMM1, bilinear_lookup[ESI]+0x10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 528 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 529 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 530 | addbyte(0x4e); | ~~~~~~~~~~~~~~ 531 | addbyte(0x10); | ~~~~~~~~~~~~~~ 532 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 533 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 534 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 535 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 536 | addbyte(0x66); /*MOV XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 537 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 538 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 539 | addbyte(0xc0 | 0 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 540 | addbyte(0x66); /*PSRLDQ XMM0, 64*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 541 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 542 | addbyte(0x73); | ~~~~~~~~~~~~~~ 543 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 544 | addbyte(8); | ~~~~~~~~~~~ 545 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 546 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 547 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 548 | addbyte(0xc0 | 1 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 549 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 550 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 551 | addbyte(0x71); | ~~~~~~~~~~~~~~ 552 | addbyte(0xd0 | 0); | ~~~~~~~~~~~~~~~~~~ 553 | addbyte(8); | ~~~~~~~~~~~ 554 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 555 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 556 | addbyte(0x67); | ~~~~~~~~~~~~~~ 557 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 558 | | 559 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 560 | addbyte(0x89); | ~~~~~~~~~~~~~~ 561 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 562 | | 563 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 564 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 565 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 566 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 567 | } | ~ 568 | else | ~~~~ 569 | { | ~ 570 | addbyte(0xb2); /*MOV DL, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 571 | addbyte(8); | ~~~~~~~~~~~ 572 | addbyte(0x8b); /*MOV ECX, state->lod[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 573 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 574 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 | addbyte(0x48); /*MOV RBP, state->tex[RDI+RCX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 576 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 577 | addbyte(0xac); | ~~~~~~~~~~~~~~ 578 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 579 | addlong(offsetof(voodoo_state_t, tex[tmu])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 580 | addbyte(0x28); /*SUB DL, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 581 | addbyte(0xca); | ~~~~~~~~~~~~~~ 582 | addbyte(0x80); /*ADD CL, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 583 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 584 | addbyte(4); | ~~~~~~~~~~~ 585 | addbyte(0x8b); /*MOV EAX, state->tex_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 586 | addbyte(0x87); | ~~~~~~~~~~~~~~ 587 | addlong(offsetof(voodoo_state_t, tex_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 588 | addbyte(0x8b); /*MOV EBX, state->tex_t[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 589 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 590 | addlong(offsetof(voodoo_state_t, tex_t)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 591 | if (params->tLOD[tmu] & LOD_TMIRROR_S) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 592 | { | ~ 593 | addbyte(0xa9); /*TEST EAX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 594 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 595 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 596 | addbyte(2); | ~~~~~~~~~~~ 597 | addbyte(0xf7); /*NOT EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 598 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 599 | } | ~ 600 | if (params->tLOD[tmu] & LOD_TMIRROR_T) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 601 | { | ~ 602 | addbyte(0xf7); /*TEST EBX, 0x1000*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 603 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 604 | addlong(0x1000); | ~~~~~~~~~~~~~~~~ 605 | addbyte(0x74); /*JZ +*/ | ~~~~~~~~~~~~~~~~~~~~~~~ 606 | addbyte(2); | ~~~~~~~~~~~ 607 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 608 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 609 | } | ~ 610 | addbyte(0xd3); /*SHR EAX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 611 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 612 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 613 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 614 | if (state->clamp_s[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 615 | { | ~ 616 | addbyte(0x85); /*TEST EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 617 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 618 | addbyte(0x41); /*CMOVS EAX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 620 | addbyte(0x48); | ~~~~~~~~~~~~~~ 621 | addbyte(0x02); | ~~~~~~~~~~~~~~ 622 | addbyte(0x3b); /*CMP EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 623 | addbyte(0x84); | ~~~~~~~~~~~~~~ 624 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 625 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 626 | addbyte(0x0f); /*CMOVAE EAX, params->tex_w_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 627 | addbyte(0x43); | ~~~~~~~~~~~~~~ 628 | addbyte(0x84); | ~~~~~~~~~~~~~~ 629 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 630 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 631 | | 632 | } | ~ 633 | else | ~~~~ 634 | { | ~ 635 | addbyte(0x23); /*AND EAX, params->tex_w_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 636 | addbyte(0x84); | ~~~~~~~~~~~~~~ 637 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 638 | addlong(offsetof(voodoo_params_t, tex_w_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 639 | } | ~ 640 | if (state->clamp_t[tmu]) | ~~~~~~~~~~~~~~~~~~~~~~~~ 641 | { | ~ 642 | addbyte(0x85); /*TEST EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 643 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 644 | addbyte(0x41); /*CMOVS EBX, R10(alookup[0](zero))*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 645 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 646 | addbyte(0x48); | ~~~~~~~~~~~~~~ 647 | addbyte(0x1a); | ~~~~~~~~~~~~~~ 648 | addbyte(0x3b); /*CMP EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 649 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 650 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 651 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 652 | addbyte(0x0f); /*CMOVAE EBX, params->tex_h_mask[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 653 | addbyte(0x43); | ~~~~~~~~~~~~~~ 654 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 655 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 656 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 657 | } | ~ 658 | else | ~~~~ 659 | { | ~ 660 | addbyte(0x23); /*AND EBX, params->tex_h_mask-0x10[ESI+ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 661 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 662 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 663 | addlong(offsetof(voodoo_params_t, tex_h_mask[tmu]) - 0x10); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 664 | } | ~ 665 | addbyte(0x88); /*MOV CL, DL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 666 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 667 | addbyte(0xd3); /*SHL EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 668 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 669 | addbyte(0x01); /*ADD EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 670 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 671 | | 672 | addbyte(0x8b); /*MOV EAX, [RBP+RBX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 673 | addbyte(0x44); | ~~~~~~~~~~~~~~ 674 | addbyte(0x9d); | ~~~~~~~~~~~~~~ 675 | addbyte(0); | ~~~~~~~~~~~ 676 | } | ~ 677 | } | ~ 678 | | 679 | return block_pos; | ~~~~~~~~~~~~~~~~~ 680 | } | ~ 681 | | 682 | static inline void voodoo_generate(uint8_t *code_block, voodoo_t *voodoo, voodoo_params_t *params, voodoo_state_t *state, int depthop) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 683 | { | ~ 684 | int block_pos = 0; | ~~~~~~~~~~~~~~~~~~ 685 | int z_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 686 | int a_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~ 687 | int chroma_skip_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 688 | int depth_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~ 689 | int depth_jump_pos2 = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 690 | int loop_jump_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~ 691 | // xmm_01_w = (__m128i)0x0001000100010001ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 692 | // xmm_ff_w = (__m128i)0x00ff00ff00ff00ffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 693 | // xmm_ff_b = (__m128i)0x00000000ffffffffull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 694 | xmm_01_w = _mm_set_epi32(0, 0, 0x00010001, 0x00010001); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 695 | xmm_ff_w = _mm_set_epi32(0, 0, 0x00ff00ff, 0x00ff00ff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 696 | xmm_ff_b = _mm_set_epi32(0, 0, 0, 0x00ffffff); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 697 | minus_254 = _mm_set_epi32(0, 0, 0xff02ff02, 0xff02ff02); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 698 | // *(uint64_t *)&const_1_48 = 0x45b0000000000000ull; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 699 | // block_pos = 0; | ~~~~~~~~~~~~~~~~~~~~~~~~ 700 | // voodoo_get_depth = &code_block[block_pos]; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 701 | /*W at (%esp+4) | ~~~~~~~~~~~~~~~ 702 | Z at (%esp+12) | ~~~~~~~~~~~~~~ 703 | new_depth at (%esp+16)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 704 | // if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depth_op == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 705 | // { | ~~~~~~~~~~~ 706 | // addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 707 | // return; | ~~~~~~~~~~~~~~~~~~~~~~~~~ 708 | // } | ~~~~~~~~~~~ 709 | addbyte(0x55); /*PUSH RBP*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 710 | addbyte(0x57); /*PUSH RDI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 711 | addbyte(0x56); /*PUSH RSI*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 712 | addbyte(0x53); /*PUSH RBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 713 | addbyte(0x41); /*PUSH R12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 714 | addbyte(0x54); | ~~~~~~~~~~~~~~ 715 | addbyte(0x41); /*PUSH R13*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 716 | addbyte(0x55); | ~~~~~~~~~~~~~~ 717 | addbyte(0x41); /*PUSH R14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 718 | addbyte(0x56); | ~~~~~~~~~~~~~~ 719 | addbyte(0x41); /*PUSH R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 720 | addbyte(0x57); | ~~~~~~~~~~~~~~ 721 | | 722 | addbyte(0x49); /*MOV R15, xmm_01_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 723 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 724 | addquad((uint64_t)(uintptr_t)&xmm_01_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 725 | addbyte(0x66); /*MOVDQA XMM8, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 726 | addbyte(0x45); | ~~~~~~~~~~~~~~ 727 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 728 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 729 | addbyte(0x07 | (0 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 730 | addbyte(0x49); /*MOV R15, xmm_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 731 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 732 | addquad((uint64_t)(uintptr_t)&xmm_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 733 | addbyte(0x66); /*MOVDQA XMM9, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 734 | addbyte(0x45); | ~~~~~~~~~~~~~~ 735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 736 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 737 | addbyte(0x07 | (1 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 738 | addbyte(0x49); /*MOV R15, xmm_ff_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 739 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 740 | addquad((uint64_t)(uintptr_t)&xmm_ff_b); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 741 | addbyte(0x66); /*MOVDQA XMM10, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 742 | addbyte(0x45); | ~~~~~~~~~~~~~~ 743 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 744 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 745 | addbyte(0x07 | (2 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 746 | addbyte(0x49); /*MOV R15, minus_254*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 747 | addbyte(0xbf); | ~~~~~~~~~~~~~~ 748 | addquad((uint64_t)(uintptr_t)&minus_254); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 749 | addbyte(0x66); /*MOVDQA XMM11, [R15]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 750 | addbyte(0x45); | ~~~~~~~~~~~~~~ 751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 752 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 753 | addbyte(0x07 | (3 << 3)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 754 | | 755 | #if WIN64 | ~~~~~~~~~ 756 | addbyte(0x48); /*MOV RDI, RCX (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 757 | addbyte(0x89); | ~~~~~~~~~~~~~~ 758 | addbyte(0xcf); | ~~~~~~~~~~~~~~ 759 | addbyte(0x49); /*MOV R15, RDX (voodoo_params)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 760 | addbyte(0x89); | ~~~~~~~~~~~~~~ 761 | addbyte(0xd7); | ~~~~~~~~~~~~~~ 762 | addbyte(0x4d); /*MOV R14, R9 (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 763 | addbyte(0x89); | ~~~~~~~~~~~~~~ 764 | addbyte(0xce); | ~~~~~~~~~~~~~~ 765 | #else | ~~~~~ 766 | addbyte(0x49); /*MOV R14, RCX (real_y)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 767 | addbyte(0x89); | ~~~~~~~~~~~~~~ 768 | addbyte(0xce); | ~~~~~~~~~~~~~~ 769 | addbyte(0x49); /*MOV R15, RSI (voodoo_state)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 770 | addbyte(0x89); | ~~~~~~~~~~~~~~ 771 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 772 | #endif | ~~~~~~ 773 | | 774 | addbyte(0x49); /*MOV R9, logtable*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 775 | addbyte(0xb8 | (9 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~ 776 | addquad((uint64_t)(uintptr_t)&logtable); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 777 | addbyte(0x49); /*MOV R10, alookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 778 | addbyte(0xb8 | (10 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 779 | addquad((uint64_t)(uintptr_t)&alookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 780 | addbyte(0x49); /*MOV R11, aminuslookup*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 781 | addbyte(0xb8 | (11 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 782 | addquad((uint64_t)(uintptr_t)&aminuslookup); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 783 | addbyte(0x49); /*MOV R12, xmm_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 784 | addbyte(0xb8 | (12 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 785 | addquad((uint64_t)(uintptr_t)&xmm_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 786 | addbyte(0x49); /*MOV R13, i_00_ff_w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 787 | addbyte(0xb8 | (13 & 7)); | ~~~~~~~~~~~~~~~~~~~~~~~~~ 788 | addquad((uint64_t)(uintptr_t)&i_00_ff_w); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 789 | | 790 | loop_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 791 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 792 | addbyte(0x89); | ~~~~~~~~~~~~~~ 793 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 794 | if (params->col_tiled || params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 795 | { | ~ 796 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 797 | addbyte(0x87); | ~~~~~~~~~~~~~~ 798 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 799 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 800 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 801 | addbyte(0x83); /*AND EAX, 63*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 802 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 803 | addbyte(63); | ~~~~~~~~~~~~ 804 | addbyte(0xc1); /*SHR EBX, 6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 805 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 806 | addbyte(6); | ~~~~~~~~~~~ 807 | addbyte(0xc1); /*SHL EBX, 11 - tile is 128*32, << 12, div 2 because word index*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 808 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 809 | addbyte(11); | ~~~~~~~~~~~~ 810 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 811 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 812 | addbyte(0x89); /*MOV state->x_tiled[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 813 | addbyte(0x87); | ~~~~~~~~~~~~~~ 814 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 815 | } | ~ 816 | addbyte(0x66); /*PXOR XMM2, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 818 | addbyte(0xef); | ~~~~~~~~~~~~~~ 819 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 820 | | 821 | if ((params->fbzMode & FBZ_W_BUFFER) || (params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 822 | { | ~ 823 | addbyte(0xb8); /*MOV new_depth, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 824 | addlong(0); | ~~~~~~~~~~~ 825 | addbyte(0x66); /*TEST w+4, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 826 | addbyte(0xf7); | ~~~~~~~~~~~~~~ 827 | addbyte(0x87); | ~~~~~~~~~~~~~~ 828 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 829 | addword(0xffff); | ~~~~~~~~~~~~~~~~ 830 | addbyte(0x75); /*JNZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 831 | depth_jump_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 832 | addbyte(0); | ~~~~~~~~~~~ 833 | // addbyte(4+5+2+3+2+5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 834 | addbyte(0x8b); /*MOV EDX, w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 835 | addbyte(0x97); | ~~~~~~~~~~~~~~ 836 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 837 | addbyte(0xb8); /*MOV new_depth, 0xf001*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 838 | addlong(0xf001); | ~~~~~~~~~~~~~~~~ 839 | addbyte(0x89); /*MOV EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 840 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 841 | addbyte(0xc1); /*SHR EDX, 16*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 842 | addbyte(0xea); | ~~~~~~~~~~~~~~ 843 | addbyte(16); | ~~~~~~~~~~~~ 844 | addbyte(0x74); /*JZ got_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 845 | depth_jump_pos2 = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 846 | addbyte(0); | ~~~~~~~~~~~ 847 | // addbyte(5+5+3+2+2+2+/*3+*/3+2+6+4+5+2+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 848 | addbyte(0xb9); /*MOV ECX, 19*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 849 | addlong(19); | ~~~~~~~~~~~~ 850 | addbyte(0x0f); /*BSR EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 851 | addbyte(0xbd); | ~~~~~~~~~~~~~~ 852 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 853 | addbyte(0xba); /*MOV EDX, 15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 854 | addlong(15); | ~~~~~~~~~~~~ 855 | addbyte(0xf7); /*NOT EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 856 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 857 | addbyte(0x29); /*SUB EDX, EAX - EDX = exp*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 858 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 859 | addbyte(0x29); /*SUB ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 860 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 861 | addbyte(0xc1); /*SHL EDX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 862 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 863 | addbyte(12); | ~~~~~~~~~~~~ 864 | addbyte(0xd3); /*SHR EBX, CL*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 865 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 866 | addbyte(0x81); /*AND EBX, 0xfff - EBX = mant*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 867 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 868 | addlong(0xfff); | ~~~~~~~~~~~~~~~ 869 | addbyte(0x67); /*LEA EAX, 1[EDX, EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 870 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 871 | addbyte(0x44); | ~~~~~~~~~~~~~~ 872 | addbyte(0x13); | ~~~~~~~~~~~~~~ 873 | addbyte(1); | ~~~~~~~~~~~ 874 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 875 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 876 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 877 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 878 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 879 | addbyte(0x47); | ~~~~~~~~~~~~~~ 880 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 881 | | 882 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 883 | *(uint8_t *)&code_block[depth_jump_pos] = (block_pos - depth_jump_pos) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 884 | if (depth_jump_pos) | ~~~~~~~~~~~~~~~~~~~ 885 | *(uint8_t *)&code_block[depth_jump_pos2] = (block_pos - depth_jump_pos2) - 1; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 886 | | 887 | if ((params->fogMode & (FOG_ENABLE|FOG_CONSTANT|FOG_Z|FOG_ALPHA)) == FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 888 | { | ~ 889 | addbyte(0x89); /*MOV state->w_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 890 | addbyte(0x87); | ~~~~~~~~~~~~~~ 891 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 892 | } | ~ 893 | } | ~ 894 | if (!(params->fbzMode & FBZ_W_BUFFER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 895 | { | ~ 896 | addbyte(0x8b); /*MOV EAX, z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 897 | addbyte(0x87); | ~~~~~~~~~~~~~~ 898 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 899 | addbyte(0xbb); /*MOV EBX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 900 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 901 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 902 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 903 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 904 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 905 | addbyte(12); | ~~~~~~~~~~~~ 906 | addbyte(0x0f); /*CMOVS EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 907 | addbyte(0x48); | ~~~~~~~~~~~~~~ 908 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 909 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 910 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 911 | addbyte(0x0f); /*CMOVA EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 912 | addbyte(0x47); | ~~~~~~~~~~~~~~ 913 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 914 | } | ~ 915 | | 916 | if (params->fbzMode & FBZ_DEPTH_BIAS) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 917 | { | ~ 918 | addbyte(0x03); /*ADD EAX, params->zaColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 919 | addbyte(0x86); | ~~~~~~~~~~~~~~ 920 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 921 | addbyte(0x25); /*AND EAX, 0xffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 922 | addlong(0xffff); | ~~~~~~~~~~~~~~~~ 923 | } | ~ 924 | | 925 | addbyte(0x89); /*MOV state->new_depth[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 926 | addbyte(0x87); | ~~~~~~~~~~~~~~ 927 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 928 | | 929 | if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop != DEPTHOP_ALWAYS) && (depthop != DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 930 | { | ~ 931 | addbyte(0x8b); /*MOV EBX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 932 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 933 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 934 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 935 | else | ~~~~ 936 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 937 | addbyte(0x48); /*MOV RCX, aux_mem[RDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 938 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 939 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 940 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 941 | addbyte(0x0f); /*MOVZX EBX, [ECX+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 942 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 943 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 944 | addbyte(0x59); | ~~~~~~~~~~~~~~ 945 | if (params->fbzMode & FBZ_DEPTH_SOURCE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 946 | { | ~ 947 | addbyte(0x0f); /*MOVZX EAX, zaColor[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 948 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 949 | addbyte(0x86); | ~~~~~~~~~~~~~~ 950 | addlong(offsetof(voodoo_params_t, zaColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 951 | } | ~ 952 | addbyte(0x39); /*CMP EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 953 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 954 | if (depthop == DEPTHOP_LESSTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 955 | { | ~ 956 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 957 | addbyte(0x83); | ~~~~~~~~~~~~~~ 958 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 959 | addlong(0); | ~~~~~~~~~~~ 960 | } | ~ 961 | else if (depthop == DEPTHOP_EQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 962 | { | ~ 963 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 964 | addbyte(0x85); | ~~~~~~~~~~~~~~ 965 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 966 | addlong(0); | ~~~~~~~~~~~ 967 | } | ~ 968 | else if (depthop == DEPTHOP_LESSTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 969 | { | ~ 970 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 971 | addbyte(0x87); | ~~~~~~~~~~~~~~ 972 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 973 | addlong(0); | ~~~~~~~~~~~ 974 | } | ~ 975 | else if (depthop == DEPTHOP_GREATERTHAN) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 976 | { | ~ 977 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 978 | addbyte(0x86); | ~~~~~~~~~~~~~~ 979 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 980 | addlong(0); | ~~~~~~~~~~~ 981 | } | ~ 982 | else if (depthop == DEPTHOP_NOTEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 983 | { | ~ 984 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 985 | addbyte(0x84); | ~~~~~~~~~~~~~~ 986 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 987 | addlong(0); | ~~~~~~~~~~~ 988 | } | ~ 989 | else if (depthop == DEPTHOP_GREATERTHANEQUAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 990 | { | ~ 991 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 992 | addbyte(0x82); | ~~~~~~~~~~~~~~ 993 | z_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 994 | addlong(0); | ~~~~~~~~~~~ 995 | } | ~ 996 | else | ~~~~ 997 | fatal("Bad depth_op\n"); | ~~~~~~~~~~~~~~~~~~~~~~~~ 998 | } | ~ 999 | else if ((params->fbzMode & FBZ_DEPTH_ENABLE) && (depthop == DEPTHOP_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1000 | { | ~ 1001 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 1002 | } | ~ 1003 | | 1004 | /*XMM0 = colour*/ | ~~~~~~~~~~~~~~~~~ 1005 | /*XMM2 = 0 (for unpacking*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1006 | | 1007 | /*EDI = state, ESI = params*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1008 | | 1009 | if ((params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL || !voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1010 | { | ~ 1011 | /*TMU0 only sampling local colour or only one TMU, only sample TMU0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1012 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1013 | | 1014 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1016 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1018 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1019 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1020 | addbyte(24); | ~~~~~~~~~~~~ 1021 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1022 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1023 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1024 | } | ~ 1025 | else if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1026 | { | ~ 1027 | /*TMU0 in pass-through mode, only sample TMU1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1028 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1029 | | 1030 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1031 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1032 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1033 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1034 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1035 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1036 | addbyte(24); | ~~~~~~~~~~~~ 1037 | addbyte(0x89); /*MOV state->tex_a[RDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1038 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1039 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1040 | } | ~ 1041 | else | ~~~~ 1042 | { | ~ 1043 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1044 | | 1045 | addbyte(0x66); /*MOVD XMM3, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1046 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1047 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1048 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1049 | if ((params->textureMode[1] & TEXTUREMODE_TRILINEAR) && tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1050 | { | ~ 1051 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1052 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1053 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1054 | if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1055 | { | ~ 1056 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1057 | addlong(1); | ~~~~~~~~~~~ 1058 | } | ~ 1059 | else | ~~~~ 1060 | { | ~ 1061 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1062 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1063 | } | ~ 1064 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1065 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1066 | addbyte(1); | ~~~~~~~~~~~ 1067 | if (!tca_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1068 | { | ~ 1069 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1070 | addlong(1); | ~~~~~~~~~~~ 1071 | } | ~ 1072 | else | ~~~~ 1073 | { | ~ 1074 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1075 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1076 | } | ~ 1077 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1078 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1079 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1080 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1081 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1082 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1083 | addbyte(4); | ~~~~~~~~~~~ 1084 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1085 | } | ~ 1086 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1087 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1088 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1089 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1090 | if (tc_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1091 | { | ~ 1092 | switch (tc_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~ 1093 | { | ~ 1094 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1095 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1096 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1097 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1098 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1099 | break; | ~~~~~~ 1100 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1101 | addbyte(0xf3); /*MOVQ XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1102 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1103 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1104 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1105 | break; | ~~~~~~ 1106 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1107 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1108 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1109 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1110 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1111 | break; | ~~~~~~ 1112 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1113 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1114 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1115 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1116 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1117 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1118 | break; | ~~~~~~ 1119 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1120 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1121 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1122 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1123 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1124 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1125 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1126 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1127 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1128 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1129 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1130 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1131 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1132 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1133 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1134 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1135 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1136 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1137 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1138 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1139 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1141 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1142 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1143 | addbyte(0); | ~~~~~~~~~~~ 1144 | break; | ~~~~~~ 1145 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1146 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1147 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1148 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1149 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1150 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1151 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1152 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1153 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1154 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1155 | addbyte(0); | ~~~~~~~~~~~ 1156 | break; | ~~~~~~ 1157 | } | ~ 1158 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1159 | { | ~ 1160 | addbyte(0x66); /*PXOR XMM0, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1161 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1162 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1163 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1164 | addbyte(0x04); | ~~~~~~~~~~~~~~ 1165 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1166 | } | ~ 1167 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1168 | { | ~ 1169 | addbyte(0x66); /*PXOR XMM0, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1170 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1171 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1172 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1173 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1174 | } | ~ 1175 | addbyte(0x66); /*PADDW XMM0, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1176 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1177 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1178 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1179 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1180 | addbyte(0xf3); /*MOVQ XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1181 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1182 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1183 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1184 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1185 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1186 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1187 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1188 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1190 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1191 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1192 | addbyte(0x66); /*PMULHW XMM5, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1193 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1194 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1195 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1196 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1198 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1199 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 1200 | addbyte(0x66); /*PSRAD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1202 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1203 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1204 | addbyte(8); | ~~~~~~~~~~~ 1205 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1206 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1207 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1208 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1209 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1210 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1211 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1212 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1213 | if (tc_add_clocal_1) | ~~~~~~~~~~~~~~~~~~~~ 1214 | { | ~ 1215 | addbyte(0x66); /*PADDW XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1216 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1217 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1218 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1219 | } | ~ 1220 | else if (tc_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1221 | { | ~ 1222 | addbyte(0xf2); /*PSHUFLW XMM0, XMM3, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1224 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1225 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1226 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1227 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1228 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1229 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1230 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1231 | } | ~ 1232 | addbyte(0x66); /*PACKUSWB XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1234 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1235 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1236 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1237 | { | ~ 1238 | addbyte(0x66); /*MOVD EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1242 | } | ~ 1243 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1244 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1245 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1246 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1247 | } | ~ 1248 | | 1249 | if (tca_sub_clocal_1) | ~~~~~~~~~~~~~~~~~~~~~ 1250 | { | ~ 1251 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1252 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1253 | addbyte(24); | ~~~~~~~~~~~~ 1254 | switch (tca_mselect_1) | ~~~~~~~~~~~~~~~~~~~~~~ 1255 | { | ~ 1256 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1257 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1258 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1259 | break; | ~~~~~~ 1260 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1261 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1262 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1263 | break; | ~~~~~~ 1264 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1265 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1266 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1267 | break; | ~~~~~~ 1268 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1269 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1270 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1271 | break; | ~~~~~~ 1272 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1273 | addbyte(0xb8); /*MOV EAX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1274 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1275 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1276 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1277 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1278 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1279 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1280 | addbyte(0xc1); /*SHL EAX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1281 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1282 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1283 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1284 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1285 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1286 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1287 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1288 | break; | ~~~~~~ 1289 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1290 | addbyte(0x8b); /*MOV EAX, state->lod_frac[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1291 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1292 | addlong(offsetof(voodoo_state_t, lod_frac[1])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1293 | break; | ~~~~~~ 1294 | } | ~ 1295 | if (params->textureMode[1] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1296 | { | ~ 1297 | addbyte(0x41); /*XOR EAX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1298 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1299 | addbyte(0x44); | ~~~~~~~~~~~~~~ 1300 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1301 | addbyte(0); | ~~~~~~~~~~~ 1302 | } | ~ 1303 | else if (!tc_reverse_blend_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1304 | { | ~ 1305 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1306 | addlong(0xff); | ~~~~~~~~~~~~~~ 1307 | } | ~ 1308 | addbyte(0x8e); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1309 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1310 | addbyte(1); | ~~~~~~~~~~~ 1311 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1312 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1313 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1314 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1315 | addlong(0xff); | ~~~~~~~~~~~~~~ 1316 | addbyte(0xf7); /*NEG EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1317 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1318 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1319 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1320 | addbyte(8); | ~~~~~~~~~~~ 1321 | if (tca_add_clocal_1 || tca_add_alocal_1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1322 | { | ~ 1323 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1324 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1325 | } | ~ 1326 | addbyte(0x39); /*CMP ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1327 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1328 | addbyte(0x0f); /*CMOVA ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1329 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1330 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1331 | addbyte(0x66); /*PINSRW 3, XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1332 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1333 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 1334 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1335 | addbyte(3); | ~~~~~~~~~~~ 1336 | } | ~ 1337 | | 1338 | block_pos = codegen_texture_fetch(code_block, voodoo, params, state, block_pos, 0); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1339 | | 1340 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1341 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1342 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1343 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1344 | addbyte(0x66); /*MOVD XMM7, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1345 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1346 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1347 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1348 | | 1349 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1350 | { | ~ 1351 | addbyte(0x8b); /*MOV EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1352 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1353 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1354 | if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 1355 | { | ~ 1356 | addbyte(0xbb); /*MOV EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1357 | addlong(1); | ~~~~~~~~~~~ 1358 | } | ~ 1359 | else | ~~~~ 1360 | { | ~ 1361 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1362 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1363 | } | ~ 1364 | addbyte(0x83); /*AND EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1365 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1366 | addbyte(1); | ~~~~~~~~~~~ 1367 | if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 1368 | { | ~ 1369 | addbyte(0xb9); /*MOV ECX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1370 | addlong(1); | ~~~~~~~~~~~ 1371 | } | ~ 1372 | else | ~~~~ 1373 | { | ~ 1374 | addbyte(0x31); /*XOR ECX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1375 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1376 | } | ~ 1377 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1378 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1379 | addbyte(0x31); /*XOR ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1380 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1381 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1382 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1383 | addbyte(4); | ~~~~~~~~~~~ 1384 | /*EBX = tc_reverse_blend, ECX=tca_reverse_blend*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1385 | } | ~ 1386 | | 1387 | /*XMM0 = TMU0 output, XMM3 = TMU1 output*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1388 | | 1389 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1390 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1391 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1392 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1393 | if (tc_zero_other) | ~~~~~~~~~~~~~~~~~~ 1394 | { | ~ 1395 | addbyte(0x66); /*PXOR XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1396 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1397 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1398 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1399 | } | ~ 1400 | else | ~~~~ 1401 | { | ~ 1402 | addbyte(0xf3); /*MOV XMM1, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1403 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1404 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1405 | addbyte(0xcb); | ~~~~~~~~~~~~~~ 1406 | } | ~ 1407 | if (tc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 1408 | { | ~ 1409 | addbyte(0x66); /*PSUBW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1410 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1411 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1412 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1413 | } | ~ 1414 | | 1415 | switch (tc_mselect) | ~~~~~~~~~~~~~~~~~~~ 1416 | { | ~ 1417 | case TC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 1418 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1419 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1420 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1421 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1422 | break; | ~~~~~~ 1423 | case TC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1424 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1425 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1426 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1427 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1428 | break; | ~~~~~~ 1429 | case TC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 1430 | addbyte(0xf2); /*PSHUFLW XMM4, XMM3, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1431 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1432 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1433 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1434 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1435 | break; | ~~~~~~ 1436 | case TC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1437 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1438 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1439 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1440 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1441 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1442 | break; | ~~~~~~ 1443 | case TC_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~ 1444 | addbyte(0xb8); /*MOV EAX, params->detail_bias[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1445 | addlong(params->detail_bias[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1446 | addbyte(0x2b); /*SUB EAX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1447 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1448 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1449 | addbyte(0xba); /*MOV EDX, params->detail_max[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1450 | addlong(params->detail_max[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1451 | addbyte(0xc1); /*SHL EAX, params->detail_scale[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1452 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1453 | addbyte(params->detail_scale[0]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1454 | addbyte(0x39); /*CMP EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1455 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 1456 | addbyte(0x0f); /*CMOVNL EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1457 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1458 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1459 | addbyte(0x66); /*MOVD XMM4, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1460 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1461 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1462 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1463 | addbyte(0xf2); /*PSHUFLW XMM4, XMM4, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1464 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1465 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1466 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1467 | addbyte(0); | ~~~~~~~~~~~ 1468 | break; | ~~~~~~ 1469 | case TC_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 1470 | addbyte(0x66); /*MOVD XMM0, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1471 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1472 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1473 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 1474 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1475 | addbyte(0xf2); /*PSHUFLW XMM0, XMM0, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1476 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1477 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1478 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 1479 | addbyte(0); | ~~~~~~~~~~~ 1480 | break; | ~~~~~~ 1481 | } | ~ 1482 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1483 | { | ~ 1484 | addbyte(0x66); /*PXOR XMM4, R12(xmm_00_ff_w)[EBX]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1485 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1486 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1487 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1488 | addbyte(0x24); | ~~~~~~~~~~~~~~ 1489 | addbyte(0x1c); | ~~~~~~~~~~~~~~ 1490 | } | ~ 1491 | else if (!tc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1492 | { | ~ 1493 | addbyte(0x66); /*PXOR XMM4, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1494 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1495 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1496 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1497 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1498 | } | ~ 1499 | addbyte(0x66); /*PADDW XMM4, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1500 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1501 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1502 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1503 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1504 | addbyte(0xf3); /*MOVQ XMM5, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1505 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1506 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1507 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 1508 | addbyte(0x66); /*PMULLW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1509 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1510 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 1511 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1512 | | 1513 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1514 | { | ~ 1515 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1516 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1517 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1518 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1519 | } | ~ 1520 | | 1521 | addbyte(0x66); /*PMULHW XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1522 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1523 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 1524 | addbyte(0xec); | ~~~~~~~~~~~~~~ 1525 | addbyte(0x66); /*PUNPCKLWD XMM1, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1526 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1527 | addbyte(0x61); | ~~~~~~~~~~~~~~ 1528 | addbyte(0xcd); | ~~~~~~~~~~~~~~ 1529 | addbyte(0x66); /*PSRAD XMM1, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1530 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1531 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1532 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1533 | addbyte(8); | ~~~~~~~~~~~ 1534 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1535 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1536 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1537 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1538 | | 1539 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1540 | { | ~ 1541 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1542 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1543 | addbyte(24); | ~~~~~~~~~~~~ 1544 | } | ~ 1545 | | 1546 | if (tc_add_clocal) | ~~~~~~~~~~~~~~~~~~ 1547 | { | ~ 1548 | addbyte(0x66); /*PADDW XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1549 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1550 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 1551 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1552 | } | ~ 1553 | else if (tc_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~ 1554 | { | ~ 1555 | addbyte(0xf2); /*PSHUFLW XMM4, XMM0, 3, 3, 3, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1556 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1557 | addbyte(0x70); | ~~~~~~~~~~~~~~ 1558 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1559 | addbyte(0xff); | ~~~~~~~~~~~~~~ 1560 | addbyte(0x66); /*PADDW XMM1, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1561 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1562 | addbyte(0xfc); | ~~~~~~~~~~~~~~ 1563 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 1564 | } | ~ 1565 | if (tc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 1566 | { | ~ 1567 | addbyte(0x66); /*PXOR XMM1, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1568 | addbyte(0x41); | ~~~~~~~~~~~~~~ 1569 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1570 | addbyte(0xef); | ~~~~~~~~~~~~~~ 1571 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1572 | } | ~ 1573 | | 1574 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1576 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1577 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1578 | addbyte(0x66); /*PACKUSWB XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1579 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1580 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1581 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1582 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1583 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1584 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1585 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1586 | | 1587 | if (tca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1588 | { | ~ 1589 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1590 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1591 | } | ~ 1592 | else | ~~~~ 1593 | { | ~ 1594 | addbyte(0x66); /*MOV EAX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1595 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1596 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1597 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1598 | addbyte(0xc1); /*SHR EAX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1599 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 1600 | addbyte(24); | ~~~~~~~~~~~~ 1601 | } | ~ 1602 | if (tca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1603 | { | ~ 1604 | addbyte(0x29); /*SUB EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1605 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1606 | } | ~ 1607 | switch (tca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 1608 | { | ~ 1609 | case TCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 1610 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1611 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1612 | break; | ~~~~~~ 1613 | case TCA_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1614 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1615 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1616 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1617 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1618 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1619 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1620 | addbyte(24); | ~~~~~~~~~~~~ 1621 | break; | ~~~~~~ 1622 | case TCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1623 | addbyte(0x66); /*MOV EBX, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1624 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1625 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1626 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1627 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1628 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1629 | addbyte(24); | ~~~~~~~~~~~~ 1630 | break; | ~~~~~~ 1631 | case TCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1632 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1633 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1634 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1635 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1636 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1637 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1638 | addbyte(24); | ~~~~~~~~~~~~ 1639 | break; | ~~~~~~ 1640 | case TCA_MSELECT_DETAIL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1641 | addbyte(0xbb); /*MOV EBX, params->detail_bias[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1642 | addlong(params->detail_bias[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1643 | addbyte(0x2b); /*SUB EBX, state->lod*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1644 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1645 | addlong(offsetof(voodoo_state_t, lod)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1646 | addbyte(0xba); /*MOV EDX, params->detail_max[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1647 | addlong(params->detail_max[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1648 | addbyte(0xc1); /*SHL EBX, params->detail_scale[1]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1649 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1650 | addbyte(params->detail_scale[1]); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1651 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1652 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1653 | addbyte(0x0f); /*CMOVNL EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1654 | addbyte(0x4d); | ~~~~~~~~~~~~~~ 1655 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1656 | break; | ~~~~~~ 1657 | case TCA_MSELECT_LOD_FRAC: | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1658 | addbyte(0x8b); /*MOV EBX, state->lod_frac[0]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1659 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1660 | addlong(offsetof(voodoo_state_t, lod_frac[0])); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1661 | break; | ~~~~~~ 1662 | } | ~ 1663 | if (params->textureMode[0] & TEXTUREMODE_TRILINEAR) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1664 | { | ~ 1665 | addbyte(0x41); /*XOR EBX, R13(i_00_ff_w)[ECX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1666 | addbyte(0x33); | ~~~~~~~~~~~~~~ 1667 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 1668 | addbyte(0x8d); | ~~~~~~~~~~~~~~ 1669 | addbyte(0); | ~~~~~~~~~~~ 1670 | } | ~ 1671 | else if (!tca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1672 | { | ~ 1673 | addbyte(0x81); /*XOR EBX, 0xFF*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1674 | addbyte(0xf3); | ~~~~~~~~~~~~~~ 1675 | addlong(0xff); | ~~~~~~~~~~~~~~ 1676 | } | ~ 1677 | | 1678 | addbyte(0x83); /*ADD EBX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1679 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1680 | addbyte(1); | ~~~~~~~~~~~ 1681 | addbyte(0x0f); /*IMUL EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1682 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 1683 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1684 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1685 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1686 | addbyte(0xc1); /*SAR EAX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1687 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 1688 | addbyte(8); | ~~~~~~~~~~~ 1689 | if (tca_add_clocal || tca_add_alocal) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1690 | { | ~ 1691 | addbyte(0x66); /*MOV EBX, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1692 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1693 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1694 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1695 | addbyte(0xc1); /*SHR EBX, 24*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1696 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 1697 | addbyte(24); | ~~~~~~~~~~~~ 1698 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1699 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1700 | } | ~ 1701 | addbyte(0x0f); /*CMOVS EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1702 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1703 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1704 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1705 | addlong(0xff); | ~~~~~~~~~~~~~~ 1706 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1707 | addlong(0xff); | ~~~~~~~~~~~~~~ 1708 | addbyte(0x0f); /*CMOVA EAX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1709 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1710 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 1711 | if (tca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 1712 | { | ~ 1713 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1714 | addlong(0xff); | ~~~~~~~~~~~~~~ 1715 | } | ~ 1716 | | 1717 | addbyte(0x89); /*MOV state->tex_a[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1718 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1719 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1720 | | 1721 | addbyte(0xf3); /*MOVQ XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1722 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1723 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1724 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 1725 | } | ~ 1726 | if (cc_mselect == CC_MSELECT_TEXRGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1727 | { | ~ 1728 | addbyte(0xf3); /*MOVD XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1729 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1730 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1731 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1732 | } | ~ 1733 | | 1734 | if ((params->fbzMode & FBZ_CHROMAKEY)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1735 | { | ~ 1736 | switch (_rgb_sel) | ~~~~~~~~~~~~~~~~~ 1737 | { | ~ 1738 | case CC_LOCALSELECT_ITER_RGB: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1739 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1740 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1741 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1742 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1743 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1744 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1745 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1746 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1747 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 1748 | addbyte(12); | ~~~~~~~~~~~~ 1749 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1750 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1751 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1752 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1753 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1754 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1755 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1756 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1757 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1758 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1759 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1760 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1761 | break; | ~~~~~~ 1762 | case CC_LOCALSELECT_COLOR1: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1763 | addbyte(0x8b); /*MOV EAX, params->color1[RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1764 | addbyte(0x86); | ~~~~~~~~~~~~~~ 1765 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1766 | break; | ~~~~~~ 1767 | case CC_LOCALSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~~~~ 1768 | addbyte(0x66); /*MOVD EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1769 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1770 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 1771 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1772 | break; | ~~~~~~ 1773 | } | ~ 1774 | addbyte(0x8b); /*MOV EBX, params->chromaKey[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1775 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1776 | addlong(offsetof(voodoo_params_t, chromaKey)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1777 | addbyte(0x31); /*XOR EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1778 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 1779 | addbyte(0x81); /*AND EBX, 0xffffff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1780 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 1781 | addlong(0xffffff); | ~~~~~~~~~~~~~~~~~~ 1782 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1783 | addbyte(0x84); | ~~~~~~~~~~~~~~ 1784 | chroma_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1785 | addlong(0); | ~~~~~~~~~~~ 1786 | } | ~ 1787 | | 1788 | if (voodoo->trexInit1[0] & (1 << 18)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1789 | { | ~ 1790 | addbyte(0xb8); /*MOV EAX, tmuConfig*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1791 | addlong(voodoo->tmuConfig); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1792 | addbyte(0x66); /*MOVD XMM0, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1793 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1794 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1795 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1796 | } | ~ 1797 | | 1798 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1799 | { | ~ 1800 | /*EBX = a_other*/ | ~~~~~~~~~~~~~~~~~ 1801 | switch (a_sel) | ~~~~~~~~~~~~~~ 1802 | { | ~ 1803 | case A_SEL_ITER_A: | ~~~~~~~~~~~~~~~~~~ 1804 | addbyte(0x8b); /*MOV EBX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1805 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1806 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1807 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1808 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1809 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1810 | addlong(0xff); | ~~~~~~~~~~~~~~ 1811 | addbyte(0xc1); /*SAR EBX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1812 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 1813 | addbyte(12); | ~~~~~~~~~~~~ 1814 | addbyte(0x0f); /*CMOVS EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1815 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1816 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 1817 | addbyte(0x39); /*CMP EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1818 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 1819 | addbyte(0x0f); /*CMOVA EBX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1820 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1821 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1822 | break; | ~~~~~~ 1823 | case A_SEL_TEX: | ~~~~~~~~~~~~~~~ 1824 | addbyte(0x8b); /*MOV EBX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1825 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 1826 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1827 | break; | ~~~~~~ 1828 | case A_SEL_COLOR1: | ~~~~~~~~~~~~~~~~~~ 1829 | addbyte(0x0f); /*MOVZX EBX, params->color1+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1830 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1831 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 1832 | addlong(offsetof(voodoo_params_t, color1)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1833 | break; | ~~~~~~ 1834 | default: | ~~~~~~~~ 1835 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1836 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 1837 | break; | ~~~~~~ 1838 | } | ~ 1839 | /*ECX = a_local*/ | ~~~~~~~~~~~~~~~~~ 1840 | switch (cca_localselect) | ~~~~~~~~~~~~~~~~~~~~~~~~ 1841 | { | ~ 1842 | case CCA_LOCALSELECT_ITER_A: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1843 | if (a_sel == A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1844 | { | ~ 1845 | addbyte(0x89); /*MOV ECX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1846 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 1847 | } | ~ 1848 | else | ~~~~ 1849 | { | ~ 1850 | addbyte(0x8b); /*MOV ECX, state->ia*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1851 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1852 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1853 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1854 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1855 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1856 | addlong(0xff); | ~~~~~~~~~~~~~~ 1857 | addbyte(0xc1);/*SAR ECX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1858 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1859 | addbyte(12); | ~~~~~~~~~~~~ 1860 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1861 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1862 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1863 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1864 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1865 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1866 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1867 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1868 | } | ~ 1869 | break; | ~~~~~~ 1870 | case CCA_LOCALSELECT_COLOR0: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1871 | addbyte(0x0f); /*MOVZX ECX, params->color0+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1872 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 1873 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1874 | addlong(offsetof(voodoo_params_t, color0)+3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1875 | break; | ~~~~~~ 1876 | case CCA_LOCALSELECT_ITER_Z: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1877 | addbyte(0x8b); /*MOV ECX, state->z*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1878 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1879 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1880 | if (a_sel != A_SEL_ITER_A) | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 1881 | { | ~ 1882 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1883 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 1884 | addbyte(0xba); /*MOV EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1885 | addlong(0xff); | ~~~~~~~~~~~~~~ 1886 | } | ~ 1887 | addbyte(0xc1);/*SAR ECX, 20*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1888 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 1889 | addbyte(20); | ~~~~~~~~~~~~ 1890 | addbyte(0x0f); /*CMOVS ECX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1891 | addbyte(0x48); | ~~~~~~~~~~~~~~ 1892 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 1893 | addbyte(0x39); /*CMP ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1894 | addbyte(0xd1); | ~~~~~~~~~~~~~~ 1895 | addbyte(0x0f); /*CMOVA ECX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1896 | addbyte(0x47); | ~~~~~~~~~~~~~~ 1897 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1898 | break; | ~~~~~~ 1899 | | 1900 | default: | ~~~~~~~~ 1901 | addbyte(0xb9); /*MOV ECX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1902 | addlong(0xff); | ~~~~~~~~~~~~~~ 1903 | break; | ~~~~~~ 1904 | } | ~ 1905 | | 1906 | if (cca_zero_other) | ~~~~~~~~~~~~~~~~~~~ 1907 | { | ~ 1908 | addbyte(0x31); /*XOR EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1909 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 1910 | } | ~ 1911 | else | ~~~~ 1912 | { | ~ 1913 | addbyte(0x89); /*MOV EDX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1914 | addbyte(0xda); | ~~~~~~~~~~~~~~ 1915 | } | ~ 1916 | | 1917 | if (cca_sub_clocal) | ~~~~~~~~~~~~~~~~~~~ 1918 | { | ~ 1919 | addbyte(0x29); /*SUB EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1920 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1921 | } | ~ 1922 | } | ~ 1923 | | 1924 | if (cc_sub_clocal || cc_mselect == 1 || cc_add == 1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1925 | { | ~ 1926 | /*XMM1 = local*/ | ~~~~~~~~~~~~~~~~ 1927 | if (!cc_localselect_override) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1928 | { | ~ 1929 | if (cc_localselect) | ~~~~~~~~~~~~~~~~~~~ 1930 | { | ~ 1931 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1933 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1934 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1935 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1936 | } | ~ 1937 | else | ~~~~ 1938 | { | ~ 1939 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1940 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1941 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1942 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1943 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1944 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1946 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1947 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1948 | addbyte(12); | ~~~~~~~~~~~~ 1949 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1950 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1951 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1952 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1953 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1954 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1955 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1956 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1957 | } | ~ 1958 | } | ~ 1959 | else | ~~~~ 1960 | { | ~ 1961 | addbyte(0xf6); /*TEST state->tex_a, 0x80*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1962 | addbyte(0x87); | ~~~~~~~~~~~~~~ 1963 | addbyte(0x23); | ~~~~~~~~~~~~~~ 1964 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1965 | addbyte(0x80); | ~~~~~~~~~~~~~~ 1966 | addbyte(0x74);/*JZ !cc_localselect*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1967 | addbyte(8+2); | ~~~~~~~~~~~~~ 1968 | addbyte(0x66); /*MOVD XMM1, params->color0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1969 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1970 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 1971 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 1972 | addlong(offsetof(voodoo_params_t, color0)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1973 | addbyte(0xeb); /*JMP +*/ | ~~~~~~~~~~~~~~~~~~~~~~~~ 1974 | addbyte(8+5+4+4); | ~~~~~~~~~~~~~~~~~ 1975 | /*!cc_localselect:*/ | ~~~~~~~~~~~~~~~~~~~~ 1976 | addbyte(0xf3); /*MOVDQU XMM1, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1977 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1978 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 1979 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 1980 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1981 | addbyte(0x66); /*PSRAD XMM1, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1982 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1983 | addbyte(0x72); | ~~~~~~~~~~~~~~ 1984 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 1985 | addbyte(12); | ~~~~~~~~~~~~ 1986 | addbyte(0x66); /*PACKSSDW XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1987 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1988 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 1989 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1990 | addbyte(0x66); /*PACKUSWB XMM1, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1991 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1992 | addbyte(0x67); | ~~~~~~~~~~~~~~ 1993 | addbyte(0xc9); | ~~~~~~~~~~~~~~ 1994 | } | ~ 1995 | addbyte(0x66); /*PUNPCKLBW XMM1, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 1996 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 1997 | addbyte(0x60); | ~~~~~~~~~~~~~~ 1998 | addbyte(0xca); | ~~~~~~~~~~~~~~ 1999 | } | ~ 2000 | if (!cc_zero_other) | ~~~~~~~~~~~~~~~~~~~ 2001 | { | ~ 2002 | if (_rgb_sel == CC_LOCALSELECT_ITER_RGB) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2003 | { | ~ 2004 | addbyte(0xf3); /*MOVDQU XMM0, ib*/ /* ir, ig and ib must be in same dqword!*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2005 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2006 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2007 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2008 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2009 | addbyte(0x66); /*PSRAD XMM0, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2010 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2011 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2012 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2013 | addbyte(12); | ~~~~~~~~~~~~ 2014 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2015 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2016 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2017 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2018 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2019 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2020 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2021 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2022 | } | ~ 2023 | else if (_rgb_sel == CC_LOCALSELECT_TEX) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2024 | { | ~ 2025 | #if 0 | ~~~~~ 2026 | addbyte(0xf3); /*MOVDQU XMM0, state->tex_b*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2027 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2028 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 2029 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2030 | addlong(offsetof(voodoo_state_t, tex_b)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2031 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2032 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2033 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2034 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2035 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2036 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2037 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2038 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2039 | #endif | ~~~~~~ 2040 | } | ~ 2041 | else if (_rgb_sel == CC_LOCALSELECT_COLOR1) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2042 | { | ~ 2043 | addbyte(0x66); /*MOVD XMM0, params->color1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2044 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2045 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2046 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2047 | addlong(offsetof(voodoo_params_t, color1)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2048 | } | ~ 2049 | else | ~~~~ 2050 | { | ~ 2051 | /*MOVD XMM0, src_r*/ | ~~~~~~~~~~~~~~~~~~~~ 2052 | } | ~ 2053 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2054 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2055 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2056 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2057 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2058 | { | ~ 2059 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2060 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2061 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2062 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2063 | } | ~ 2064 | } | ~ 2065 | else | ~~~~ 2066 | { | ~ 2067 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2068 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2069 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2070 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2071 | if (cc_sub_clocal) | ~~~~~~~~~~~~~~~~~~ 2072 | { | ~ 2073 | addbyte(0x66); /*PSUBW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2074 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2075 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2076 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2077 | } | ~ 2078 | } | ~ 2079 | | 2080 | if (params->alphaMode & ((1 << 0) | (1 << 4))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2081 | { | ~ 2082 | if (!(cca_mselect == 0 && cca_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2083 | { | ~ 2084 | switch (cca_mselect) | ~~~~~~~~~~~~~~~~~~~~ 2085 | { | ~ 2086 | case CCA_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2087 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2088 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2089 | break; | ~~~~~~ 2090 | case CCA_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2091 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2092 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2093 | break; | ~~~~~~ 2094 | case CCA_MSELECT_ALOCAL2: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2095 | addbyte(0x89); /*MOV EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2096 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2097 | break; | ~~~~~~ 2098 | case CCA_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~~ 2099 | addbyte(0x0f); /*MOVZX EAX, state->tex_a*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2100 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2101 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2102 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2103 | break; | ~~~~~~ 2104 | | 2105 | case CCA_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~~ 2106 | default: | ~~~~~~~~ 2107 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2108 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2109 | break; | ~~~~~~ 2110 | } | ~ 2111 | if (!cca_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~~ 2112 | { | ~ 2113 | addbyte(0x35); /*XOR EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2114 | addlong(0xff); | ~~~~~~~~~~~~~~ 2115 | } | ~ 2116 | addbyte(0x83); /*ADD EAX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2117 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2118 | addbyte(1); | ~~~~~~~~~~~ 2119 | addbyte(0x0f); /*IMUL EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2120 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2121 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2122 | addbyte(0xc1); /*SHR EDX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2123 | addbyte(0xea); | ~~~~~~~~~~~~~~ 2124 | addbyte(8); | ~~~~~~~~~~~ 2125 | } | ~ 2126 | } | ~ 2127 | | 2128 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2129 | { | ~ 2130 | addbyte(0x31); /*XOR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2131 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2132 | } | ~ 2133 | | 2134 | if (!(cc_mselect == 0 && cc_reverse_blend == 0) && cc_mselect == CC_MSELECT_AOTHER) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2135 | { | ~ 2136 | /*Copy a_other to XMM3 before it gets modified*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2137 | addbyte(0x66); /*MOVD XMM3, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2138 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2139 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2140 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2141 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2142 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2143 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2144 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2145 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2146 | } | ~ 2147 | | 2148 | if (cca_add && (params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2149 | { | ~ 2150 | addbyte(0x01); /*ADD EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2151 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2152 | } | ~ 2153 | | 2154 | if ((params->alphaMode & ((1 << 0) | (1 << 4)))) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2155 | { | ~ 2156 | addbyte(0x85); /*TEST EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2157 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2158 | addbyte(0x0f); /*CMOVS EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2159 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2160 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2161 | addbyte(0xb8); /*MOV EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2162 | addlong(0xff); | ~~~~~~~~~~~~~~ 2163 | addbyte(0x81); /*CMP EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2164 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 2165 | addlong(0xff); | ~~~~~~~~~~~~~~ 2166 | addbyte(0x0f); /*CMOVA EDX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2167 | addbyte(0x47); | ~~~~~~~~~~~~~~ 2168 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2169 | if (cca_invert_output) | ~~~~~~~~~~~~~~~~~~~~~~ 2170 | { | ~ 2171 | addbyte(0x81); /*XOR EDX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2172 | addbyte(0xf2); | ~~~~~~~~~~~~~~ 2173 | addlong(0xff); | ~~~~~~~~~~~~~~ 2174 | } | ~ 2175 | } | ~ 2176 | | 2177 | if (!(cc_mselect == 0 && cc_reverse_blend == 0)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2178 | { | ~ 2179 | switch (cc_mselect) | ~~~~~~~~~~~~~~~~~~~ 2180 | { | ~ 2181 | case CC_MSELECT_ZERO: | ~~~~~~~~~~~~~~~~~~~~~ 2182 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2183 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2184 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2185 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2186 | break; | ~~~~~~ 2187 | case CC_MSELECT_CLOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2188 | addbyte(0xf3); /*MOV XMM3, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2191 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2192 | break; | ~~~~~~ 2193 | case CC_MSELECT_ALOCAL: | ~~~~~~~~~~~~~~~~~~~~~~~ 2194 | addbyte(0x66); /*MOVD XMM3, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2195 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2196 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2197 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2198 | addbyte(0xf2); /*PSHUFLW XMM3, XMM3, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2199 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2200 | addbyte(0x70); | ~~~~~~~~~~~~~~ 2201 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2202 | addbyte(0x00); | ~~~~~~~~~~~~~~ 2203 | break; | ~~~~~~ 2204 | case CC_MSELECT_AOTHER: | ~~~~~~~~~~~~~~~~~~~~~~~ 2205 | /*Handled above*/ | ~~~~~~~~~~~~~~~~~ 2206 | break; | ~~~~~~ 2207 | case CC_MSELECT_TEX: | ~~~~~~~~~~~~~~~~~~~~ 2208 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2209 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2210 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2211 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2212 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2213 | addbyte(0); | ~~~~~~~~~~~ 2214 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2216 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2217 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2218 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2219 | addbyte(1); | ~~~~~~~~~~~ 2220 | addbyte(0x66); /*PINSRW XMM3, state->tex_a, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2221 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2222 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2223 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2224 | addlong(offsetof(voodoo_state_t, tex_a)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2225 | addbyte(2); | ~~~~~~~~~~~ 2226 | break; | ~~~~~~ 2227 | case CC_MSELECT_TEXRGB: | ~~~~~~~~~~~~~~~~~~~~~~~ 2228 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2229 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2230 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2231 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2232 | addbyte(0xf3); /*MOVQ XMM3, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2233 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2234 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2235 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2236 | break; | ~~~~~~ 2237 | default: | ~~~~~~~~ 2238 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2240 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2241 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2242 | break; | ~~~~~~ 2243 | } | ~ 2244 | addbyte(0xf3); /*MOV XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2245 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2246 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2247 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2248 | if (!cc_reverse_blend) | ~~~~~~~~~~~~~~~~~~~~~~ 2249 | { | ~ 2250 | addbyte(0x66); /*PXOR XMM3, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2251 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2252 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2253 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2254 | addbyte(0xd9); | ~~~~~~~~~~~~~~ 2255 | } | ~ 2256 | addbyte(0x66); /*PADDW XMM3, XMM8(xmm_01_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2257 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2258 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2259 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2260 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2261 | addbyte(0x66); /*PMULLW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2262 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2263 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2264 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2265 | addbyte(0x66); /*PMULHW XMM4, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2266 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2267 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2268 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2269 | addbyte(0x66); /*PUNPCKLWD XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2270 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2271 | addbyte(0x61); | ~~~~~~~~~~~~~~ 2272 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2273 | addbyte(0x66); /*PSRLD XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2274 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2275 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2276 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2277 | addbyte(8); | ~~~~~~~~~~~ 2278 | addbyte(0x66); /*PACKSSDW XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2279 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2280 | addbyte(0x6b); | ~~~~~~~~~~~~~~ 2281 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2282 | } | ~ 2283 | | 2284 | if (cc_add == 1) | ~~~~~~~~~~~~~~~~ 2285 | { | ~ 2286 | addbyte(0x66); /*PADDW XMM0, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2287 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2288 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2289 | addbyte(0xc1); | ~~~~~~~~~~~~~~ 2290 | } | ~ 2291 | | 2292 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2293 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2294 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2295 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2296 | | 2297 | if (cc_invert_output) | ~~~~~~~~~~~~~~~~~~~~~ 2298 | { | ~ 2299 | addbyte(0x66); /*PXOR XMM0, XMM10(xmm_ff_b)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2300 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2301 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2302 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2303 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2304 | } | ~ 2305 | | 2306 | if (params->fogMode & FOG_ENABLE) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2307 | { | ~ 2308 | if (params->fogMode & FOG_CONSTANT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2309 | { | ~ 2310 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2311 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2312 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2313 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2314 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2315 | addbyte(0x66); /*PADDUSB XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2316 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2317 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2318 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2319 | } | ~ 2320 | else | ~~~~ 2321 | { | ~ 2322 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2323 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2324 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2325 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2326 | | 2327 | if (!(params->fogMode & FOG_ADD)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2328 | { | ~ 2329 | addbyte(0x66); /*MOVD XMM3, params->fogColor[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2330 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2331 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2332 | addbyte(0x9e); | ~~~~~~~~~~~~~~ 2333 | addlong(offsetof(voodoo_params_t, fogColor)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2334 | addbyte(0x66); /*PUNPCKLBW XMM3, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2335 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2336 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2337 | addbyte(0xda); | ~~~~~~~~~~~~~~ 2338 | } | ~ 2339 | else | ~~~~ 2340 | { | ~ 2341 | addbyte(0x66); /*PXOR XMM3, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2342 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2343 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2344 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2345 | } | ~ 2346 | | 2347 | if (!(params->fogMode & FOG_MULT)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2348 | { | ~ 2349 | addbyte(0x66); /*PSUBW XMM3, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2350 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2351 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2352 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2353 | } | ~ 2354 | | 2355 | /*Divide by 2 to prevent overflow on multiply*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2356 | addbyte(0x66); /*PSRAW XMM3, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2357 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2358 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2359 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2360 | addbyte(1); | ~~~~~~~~~~~ 2361 | | 2362 | switch (params->fogMode & (FOG_Z|FOG_ALPHA)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2363 | { | ~ 2364 | case 0: | ~~~~~~~ 2365 | addbyte(0x8b); /*MOV EBX, state->w_depth[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2366 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 2367 | addlong(offsetof(voodoo_state_t, w_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2368 | addbyte(0x89); /*MOV EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2369 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2370 | addbyte(0xc1); /*SHR EBX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2371 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 2372 | addbyte(10); | ~~~~~~~~~~~~ 2373 | addbyte(0xc1); /*SHR EAX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2374 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2375 | addbyte(2); | ~~~~~~~~~~~ 2376 | addbyte(0x83); /*AND EBX, 0x3f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2377 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2378 | addbyte(0x3f); | ~~~~~~~~~~~~~~ 2379 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2380 | addlong(0xff); | ~~~~~~~~~~~~~~ 2381 | addbyte(0xf6); /*MUL params->fogTable+1[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2382 | addbyte(0xa4); | ~~~~~~~~~~~~~~ 2383 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2384 | addlong(offsetof(voodoo_params_t, fogTable)+1); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2385 | addbyte(0x0f); /*MOVZX EBX, params->fogTable[ESI+EBX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2386 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2387 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 2388 | addbyte(0x5e); | ~~~~~~~~~~~~~~ 2389 | addlong(offsetof(voodoo_params_t, fogTable)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2390 | addbyte(0xc1); /*SHR EAX, 10*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2391 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2392 | addbyte(10); | ~~~~~~~~~~~~ 2393 | addbyte(0x01); /*ADD EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2394 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 2395 | /* int fog_idx = (w_depth >> 10) & 0x3f; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2396 | | 2397 | fog_a = params->fogTable[fog_idx].fog; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2398 | fog_a += (params->fogTable[fog_idx].dfog * ((w_depth >> 2) & 0xff)) >> 10;*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2399 | break; | ~~~~~~ 2400 | | 2401 | case FOG_Z: | ~~~~~~~~~~~ 2402 | addbyte(0x8b); /*MOV EAX, state->z[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2403 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2404 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2405 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2406 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2407 | addbyte(12); | ~~~~~~~~~~~~ 2408 | addbyte(0x25); /*AND EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2409 | addlong(0xff); | ~~~~~~~~~~~~~~ 2410 | // fog_a = (z >> 20) & 0xff; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2411 | break; | ~~~~~~ 2412 | | 2413 | case FOG_ALPHA: | ~~~~~~~~~~~~~~~ 2414 | addbyte(0x8b); /*MOV EAX, state->ia[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2415 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2416 | addlong(offsetof(voodoo_state_t, ia)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2417 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2418 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2419 | addbyte(0xc1); /*SAR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2420 | addbyte(0xf8); | ~~~~~~~~~~~~~~ 2421 | addbyte(12); | ~~~~~~~~~~~~ 2422 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2423 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2424 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2425 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2426 | addlong(0xff); | ~~~~~~~~~~~~~~ 2427 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2428 | addlong(0xff); | ~~~~~~~~~~~~~~ 2429 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2430 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2431 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2432 | // fog_a = CLAMP(ia >> 12); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2433 | break; | ~~~~~~ 2434 | | 2435 | case FOG_W: | ~~~~~~~~~~~ 2436 | addbyte(0x8b); /*MOV EAX, state->w[EDI]+4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2437 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2438 | addlong(offsetof(voodoo_state_t, w)+4); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2439 | addbyte(0x31); /*XOR EBX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2440 | addbyte(0xdb); | ~~~~~~~~~~~~~~ 2441 | addbyte(0x09); /*OR EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2442 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2443 | addbyte(0x0f); /*CMOVS EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2444 | addbyte(0x48); | ~~~~~~~~~~~~~~ 2445 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2446 | addbyte(0xbb); /*MOV EBX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2447 | addlong(0xff); | ~~~~~~~~~~~~~~ 2448 | addbyte(0x3d); /*CMP EAX, 0xff*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2449 | addlong(0xff); | ~~~~~~~~~~~~~~ 2450 | addbyte(0x0f); /*CMOVAE EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2451 | addbyte(0x43); | ~~~~~~~~~~~~~~ 2452 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2453 | // fog_a = CLAMP(w >> 32); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2454 | break; | ~~~~~~ 2455 | } | ~ 2456 | addbyte(0x01); /*ADD EAX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2457 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2458 | | 2459 | addbyte(0x66); /*PMULLW XMM3, alookup+4[EAX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2460 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2461 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2462 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2463 | addbyte(0x5c); | ~~~~~~~~~~~~~~ 2464 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2465 | addbyte(16); | ~~~~~~~~~~~~ 2466 | addbyte(0x66); /*PSRAW XMM3, 7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2467 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2468 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2469 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2470 | addbyte(7); | ~~~~~~~~~~~ 2471 | | 2472 | if (params->fogMode & FOG_MULT) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2473 | { | ~ 2474 | addbyte(0xf3); /*MOV XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2475 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2476 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2477 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2478 | } | ~ 2479 | else | ~~~~ 2480 | { | ~ 2481 | addbyte(0x66); /*PADDW XMM0, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2482 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2483 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2484 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 2485 | } | ~ 2486 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2487 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2488 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2489 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2490 | } | ~ 2491 | } | ~ 2492 | | 2493 | if ((params->alphaMode & 1) && (alpha_func != AFUNC_NEVER) && (alpha_func != AFUNC_ALWAYS)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2494 | { | ~ 2495 | addbyte(0x0f); /*MOVZX ECX, params->alphaMode+3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2496 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2497 | addbyte(0x8e); | ~~~~~~~~~~~~~~ 2498 | addlong(offsetof(voodoo_params_t, alphaMode) + 3); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2499 | addbyte(0x39); /*CMP EDX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2500 | addbyte(0xca); | ~~~~~~~~~~~~~~ 2501 | | 2502 | switch (alpha_func) | ~~~~~~~~~~~~~~~~~~~ 2503 | { | ~ 2504 | case AFUNC_LESSTHAN: | ~~~~~~~~~~~~~~~~~~~~ 2505 | addbyte(0x0f); /*JAE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2506 | addbyte(0x83); | ~~~~~~~~~~~~~~ 2507 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2508 | addlong(0); | ~~~~~~~~~~~ 2509 | break; | ~~~~~~ 2510 | case AFUNC_EQUAL: | ~~~~~~~~~~~~~~~~~ 2511 | addbyte(0x0f); /*JNE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2512 | addbyte(0x85); | ~~~~~~~~~~~~~~ 2513 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2514 | addlong(0); | ~~~~~~~~~~~ 2515 | break; | ~~~~~~ 2516 | case AFUNC_LESSTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~ 2517 | addbyte(0x0f); /*JA skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2518 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2519 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2520 | addlong(0); | ~~~~~~~~~~~ 2521 | break; | ~~~~~~ 2522 | case AFUNC_GREATERTHAN: | ~~~~~~~~~~~~~~~~~~~~~~~ 2523 | addbyte(0x0f); /*JBE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2524 | addbyte(0x86); | ~~~~~~~~~~~~~~ 2525 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2526 | addlong(0); | ~~~~~~~~~~~ 2527 | break; | ~~~~~~ 2528 | case AFUNC_NOTEQUAL: | ~~~~~~~~~~~~~~~~~~~~ 2529 | addbyte(0x0f); /*JE skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2530 | addbyte(0x84); | ~~~~~~~~~~~~~~ 2531 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2532 | addlong(0); | ~~~~~~~~~~~ 2533 | break; | ~~~~~~ 2534 | case AFUNC_GREATERTHANEQUAL: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2535 | addbyte(0x0f); /*JB skip*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~ 2536 | addbyte(0x82); | ~~~~~~~~~~~~~~ 2537 | a_skip_pos = block_pos; | ~~~~~~~~~~~~~~~~~~~~~~~ 2538 | addlong(0); | ~~~~~~~~~~~ 2539 | break; | ~~~~~~ 2540 | } | ~ 2541 | } | ~ 2542 | else if ((params->alphaMode & 1) && (alpha_func == AFUNC_NEVER)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2543 | { | ~ 2544 | addbyte(0xC3); /*RET*/ | ~~~~~~~~~~~~~~~~~~~~~~ 2545 | } | ~ 2546 | | 2547 | if (params->alphaMode & (1 << 4)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2548 | { | ~ 2549 | addbyte(0x49); /*MOV R8, rgb565*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2550 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2551 | addquad((uintptr_t)rgb565); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2552 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2553 | addbyte(0x87); | ~~~~~~~~~~~~~~ 2554 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2555 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2556 | else | ~~~~ 2557 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2558 | addbyte(0x48); /*MOV RBP, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2559 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 2560 | addbyte(0xaf); | ~~~~~~~~~~~~~~ 2561 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2562 | addbyte(0x01); /*ADD EDX, EDX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2563 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2564 | addbyte(0x0f); /*MOVZX EAX, [RBP+RAX*2]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2565 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 2566 | addbyte(0x44); | ~~~~~~~~~~~~~~ 2567 | addbyte(0x45); | ~~~~~~~~~~~~~~ 2568 | addbyte(0); | ~~~~~~~~~~~ 2569 | addbyte(0x66); /*PUNPCKLBW XMM0, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2570 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2571 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2572 | addbyte(0xc2); | ~~~~~~~~~~~~~~ 2573 | addbyte(0x66); /*MOVD XMM4, rgb565[EAX*4]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2574 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2575 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2576 | addbyte(0x6e); | ~~~~~~~~~~~~~~ 2577 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2578 | addbyte(0x80); | ~~~~~~~~~~~~~~ 2579 | addbyte(0x66); /*PUNPCKLBW XMM4, XMM2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2580 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2581 | addbyte(0x60); | ~~~~~~~~~~~~~~ 2582 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2583 | addbyte(0xf3); /*MOV XMM6, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2584 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2585 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2586 | addbyte(0xf4); | ~~~~~~~~~~~~~~ 2587 | | 2588 | switch (dest_afunc) | ~~~~~~~~~~~~~~~~~~~ 2589 | { | ~ 2590 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2591 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2592 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2593 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2594 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2595 | break; | ~~~~~~ 2596 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2597 | addbyte(0x66); /*PMULLW XMM4, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2598 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2599 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2600 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2601 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2602 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2603 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2604 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2605 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2606 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2607 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2608 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2609 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2610 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2611 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2612 | addbyte(8*2); | ~~~~~~~~~~~~~ 2613 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2614 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2615 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2616 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2617 | addbyte(8); | ~~~~~~~~~~~ 2618 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2619 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2620 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2621 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2622 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2623 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2624 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2625 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2626 | addbyte(8); | ~~~~~~~~~~~ 2627 | break; | ~~~~~~ 2628 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2629 | addbyte(0x66); /*PMULLW XMM4, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2630 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2631 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2632 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 2633 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2634 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2635 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2636 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2637 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2638 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2639 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2640 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2641 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2642 | addbyte(8*2); | ~~~~~~~~~~~~~ 2643 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2644 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2645 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2646 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2647 | addbyte(8); | ~~~~~~~~~~~ 2648 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2649 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2650 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2651 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2652 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2653 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2654 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2655 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2656 | addbyte(8); | ~~~~~~~~~~~ 2657 | break; | ~~~~~~ 2658 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2659 | break; | ~~~~~~ 2660 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2661 | break; | ~~~~~~ 2662 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2663 | addbyte(0x66); /*PMULLW XMM4, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2664 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2665 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2666 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2667 | addbyte(0x24); | ~~~~~~~~~~~~~~ 2668 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2669 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2670 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2671 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2672 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2673 | addbyte(0x66); /*PADDW XMM4, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2674 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2675 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2676 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2677 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2678 | addbyte(8*2); | ~~~~~~~~~~~~~ 2679 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2680 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2681 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2682 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2683 | addbyte(8); | ~~~~~~~~~~~ 2684 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2685 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2686 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2687 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2688 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2689 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2690 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2691 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2692 | addbyte(8); | ~~~~~~~~~~~ 2693 | break; | ~~~~~~ 2694 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2695 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2696 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2697 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2698 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2699 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2700 | addbyte(0x66); /*PSUBW XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2701 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2702 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2703 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2704 | addbyte(0x66); /*PMULLW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2705 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2706 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2707 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2708 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2709 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2710 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2711 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2712 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2713 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2714 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2715 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2716 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2717 | addbyte(8*2); | ~~~~~~~~~~~~~ 2718 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2719 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2720 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2721 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2722 | addbyte(8); | ~~~~~~~~~~~ 2723 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2724 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2725 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2726 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2727 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2728 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2729 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2730 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2731 | addbyte(8); | ~~~~~~~~~~~ 2732 | break; | ~~~~~~ 2733 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2734 | addbyte(0x66); /*PXOR XMM4, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2735 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2736 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2737 | addbyte(0xe4); | ~~~~~~~~~~~~~~ 2738 | break; | ~~~~~~ 2739 | case AFUNC_ASATURATE: | ~~~~~~~~~~~~~~~~~~~~~ 2740 | addbyte(0x66); /*PMULLW XMM4, XMM11(minus_254)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2741 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2742 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2743 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2744 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2745 | addbyte(0xf3); /*MOVQ XMM5, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2746 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2747 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2748 | addbyte(0xec); | ~~~~~~~~~~~~~~ 2749 | addbyte(0x66); /*PADDW XMM4, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2750 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2751 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2752 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2753 | addbyte(0x62); | ~~~~~~~~~~~~~~ 2754 | addbyte(8*2); | ~~~~~~~~~~~~~ 2755 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2756 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2757 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2758 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2759 | addbyte(8); | ~~~~~~~~~~~ 2760 | addbyte(0x66); /*PADDW XMM4, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2761 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2762 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2763 | addbyte(0xe5); | ~~~~~~~~~~~~~~ 2764 | addbyte(0x66); /*PSRLW XMM4, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2765 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2766 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2767 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 2768 | addbyte(8); | ~~~~~~~~~~~ 2769 | } | ~ 2770 | | 2771 | switch (src_afunc) | ~~~~~~~~~~~~~~~~~~ 2772 | { | ~ 2773 | case AFUNC_AZERO: | ~~~~~~~~~~~~~~~~~ 2774 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2775 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2776 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2777 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2778 | break; | ~~~~~~ 2779 | case AFUNC_ASRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2780 | addbyte(0x66); /*PMULLW XMM0, R10(alookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2781 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2782 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2783 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2784 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2785 | addbyte(0xd2); | ~~~~~~~~~~~~~~ 2786 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2787 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2788 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2789 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2790 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2791 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2792 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2793 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2794 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2795 | addbyte(8*2); | ~~~~~~~~~~~~~ 2796 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2797 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2798 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2799 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2800 | addbyte(8); | ~~~~~~~~~~~ 2801 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2802 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2803 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2804 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2805 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2806 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2807 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2808 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2809 | addbyte(8); | ~~~~~~~~~~~ 2810 | break; | ~~~~~~ 2811 | case AFUNC_A_COLOR: | ~~~~~~~~~~~~~~~~~~~ 2812 | addbyte(0x66); /*PMULLW XMM0, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2813 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2814 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2815 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 2816 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2817 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2818 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2819 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2820 | addbyte(0x66); /*PADDW XMM0, R10(alookup)[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2821 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2822 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2823 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2824 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2825 | addbyte(8*2); | ~~~~~~~~~~~~~ 2826 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2827 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2828 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2829 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2830 | addbyte(8); | ~~~~~~~~~~~ 2831 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2832 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2833 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2834 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2835 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2836 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2837 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2838 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2839 | addbyte(8); | ~~~~~~~~~~~ 2840 | break; | ~~~~~~ 2841 | case AFUNC_ADST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~ 2842 | break; | ~~~~~~ 2843 | case AFUNC_AONE: | ~~~~~~~~~~~~~~~~ 2844 | break; | ~~~~~~ 2845 | case AFUNC_AOMSRC_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2846 | addbyte(0x66); /*PMULLW XMM0, R11(aminuslookup)[EDX*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2847 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2848 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2849 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2850 | addbyte(0x04); | ~~~~~~~~~~~~~~ 2851 | addbyte(0xd3); | ~~~~~~~~~~~~~~ 2852 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2853 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2854 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2855 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2856 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2857 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2858 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2859 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2860 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2861 | addbyte(8*2); | ~~~~~~~~~~~~~ 2862 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2863 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2864 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2865 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2866 | addbyte(8); | ~~~~~~~~~~~ 2867 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2868 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2869 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2870 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2871 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2872 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2873 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2874 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2875 | addbyte(8); | ~~~~~~~~~~~ 2876 | break; | ~~~~~~ 2877 | case AFUNC_AOM_COLOR: | ~~~~~~~~~~~~~~~~~~~~~ 2878 | addbyte(0xf3); /*MOVQ XMM5, XMM9(xmm_ff_w)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2879 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2880 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2881 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2882 | addbyte(0xe9); | ~~~~~~~~~~~~~~ 2883 | addbyte(0x66); /*PSUBW XMM5, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2884 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2885 | addbyte(0xf9); | ~~~~~~~~~~~~~~ 2886 | addbyte(0xee); | ~~~~~~~~~~~~~~ 2887 | addbyte(0x66); /*PMULLW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2888 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2889 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2890 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2891 | addbyte(0xf3); /*MOVQ XMM5, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2892 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2893 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2894 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2895 | addbyte(0x66); /*PADDW XMM0, alookup[1*8]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2896 | addbyte(0x41); | ~~~~~~~~~~~~~~ 2897 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2898 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2899 | addbyte(0x42); | ~~~~~~~~~~~~~~ 2900 | addbyte(8*2); | ~~~~~~~~~~~~~ 2901 | addbyte(0x66); /*PSRLW XMM5, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2902 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2903 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2904 | addbyte(0xd5); | ~~~~~~~~~~~~~~ 2905 | addbyte(8); | ~~~~~~~~~~~ 2906 | addbyte(0x66); /*PADDW XMM0, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2907 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2908 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2909 | addbyte(0xc5); | ~~~~~~~~~~~~~~ 2910 | addbyte(0x66); /*PSRLW XMM0, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2911 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2912 | addbyte(0x71); | ~~~~~~~~~~~~~~ 2913 | addbyte(0xd0); | ~~~~~~~~~~~~~~ 2914 | addbyte(8); | ~~~~~~~~~~~ 2915 | break; | ~~~~~~ 2916 | case AFUNC_AOMDST_ALPHA: | ~~~~~~~~~~~~~~~~~~~~~~~~ 2917 | addbyte(0x66); /*PXOR XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2918 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2919 | addbyte(0xef); | ~~~~~~~~~~~~~~ 2920 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2921 | break; | ~~~~~~ 2922 | case AFUNC_ACOLORBEFOREFOG: | ~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2923 | break; | ~~~~~~ 2924 | } | ~ 2925 | | 2926 | addbyte(0x66); /*PADDW XMM0, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2927 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2928 | addbyte(0xfd); | ~~~~~~~~~~~~~~ 2929 | addbyte(0xc4); | ~~~~~~~~~~~~~~ 2930 | | 2931 | addbyte(0x66); /*PACKUSWB XMM0, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2932 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2933 | addbyte(0x67); | ~~~~~~~~~~~~~~ 2934 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2935 | } | ~ 2936 | | 2937 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2938 | addbyte(0x97); | ~~~~~~~~~~~~~~ 2939 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 2940 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2941 | else | ~~~~ 2942 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2943 | | 2944 | addbyte(0x66); /*MOV EAX, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2945 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 2946 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 2947 | addbyte(0xc0); | ~~~~~~~~~~~~~~ 2948 | | 2949 | if (params->fbzMode & FBZ_RGB_WMASK) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2950 | { | ~ 2951 | if (dither) | ~~~~~~~~~~~ 2952 | { | ~ 2953 | addbyte(0x49); /*MOV R8, dither_rb*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2954 | addbyte(0xb8); | ~~~~~~~~~~~~~~ 2955 | addquad(dither2x2 ? (uintptr_t)dither_rb2x2 : (uintptr_t)dither_rb); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2956 | addbyte(0x4c); /*MOV ESI, real_y (R14)*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2957 | addbyte(0x89); | ~~~~~~~~~~~~~~ 2958 | addbyte(0xf6); | ~~~~~~~~~~~~~~ 2959 | addbyte(0x0f); /*MOVZX EBX, AH*/ /*G*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2960 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2961 | addbyte(0xdc); | ~~~~~~~~~~~~~~ 2962 | if (dither2x2) | ~~~~~~~~~~~~~~ 2963 | { | ~ 2964 | addbyte(0x83); /*AND EDX, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2965 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2966 | addbyte(1); | ~~~~~~~~~~~ 2967 | addbyte(0x83); /*AND ESI, 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2968 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2969 | addbyte(1); | ~~~~~~~~~~~ 2970 | addbyte(0xc1); /*SHL EBX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2971 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2972 | addbyte(2); | ~~~~~~~~~~~ 2973 | } | ~ 2974 | else | ~~~~ 2975 | { | ~ 2976 | addbyte(0x83); /*AND EDX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2977 | addbyte(0xe2); | ~~~~~~~~~~~~~~ 2978 | addbyte(3); | ~~~~~~~~~~~ 2979 | addbyte(0x83); /*AND ESI, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2980 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 2981 | addbyte(3); | ~~~~~~~~~~~ 2982 | addbyte(0xc1); /*SHL EBX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2983 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 2984 | addbyte(4); | ~~~~~~~~~~~ 2985 | } | ~ 2986 | addbyte(0x0f); /*MOVZX ECX, AL*/ /*R*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2987 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 2988 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 2989 | if (dither2x2) | ~~~~~~~~~~~~~~ 2990 | { | ~ 2991 | addbyte(0xc1); /*SHR EAX, 14*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2992 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 2993 | addbyte(14); | ~~~~~~~~~~~~ 2994 | addbyte(0x8d); /*LEA ESI, RDX+RSI*2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 2995 | addbyte(0x34); | ~~~~~~~~~~~~~~ 2996 | addbyte(0x72); | ~~~~~~~~~~~~~~ 2997 | } | ~ 2998 | else | ~~~~ 2999 | { | ~ 3000 | addbyte(0xc1); /*SHR EAX, 12*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3001 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3002 | addbyte(12); | ~~~~~~~~~~~~ 3003 | addbyte(0x8d); /*LEA ESI, RDX+RSI*4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3004 | addbyte(0x34); | ~~~~~~~~~~~~~~ 3005 | addbyte(0xb2); | ~~~~~~~~~~~~~~ 3006 | } | ~ 3007 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3008 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3009 | if (params->col_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3010 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3011 | else | ~~~~ 3012 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3013 | addbyte(0x4c); /*ADD RSI, R8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3014 | addbyte(0x01); | ~~~~~~~~~~~~~~ 3015 | addbyte(0xc6); | ~~~~~~~~~~~~~~ 3016 | if (dither2x2) | ~~~~~~~~~~~~~~ 3017 | { | ~ 3018 | addbyte(0xc1); /*SHL ECX, 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3019 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3020 | addbyte(2); | ~~~~~~~~~~~ 3021 | addbyte(0x25); /*AND EAX, 0x3fc*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3022 | addlong(0x3fc); | ~~~~~~~~~~~~~~~ 3023 | } | ~ 3024 | else | ~~~~ 3025 | { | ~ 3026 | addbyte(0xc1); /*SHL ECX, 4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3027 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3028 | addbyte(4); | ~~~~~~~~~~~ 3029 | addbyte(0x25); /*AND EAX, 0xff0*/ /*B*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3030 | addlong(0xff0); | ~~~~~~~~~~~~~~~ 3031 | } | ~ 3032 | addbyte(0x0f); /*MOVZX EBX, dither_g[EBX+ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3033 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3034 | addbyte(0x9c); | ~~~~~~~~~~~~~~ 3035 | addbyte(0x1e); | ~~~~~~~~~~~~~~ 3036 | addlong(dither2x2 ? ((uintptr_t)dither_g2x2 - (uintptr_t)dither_rb2x2) : ((uintptr_t)dither_g - (uintptr_t)dither_rb)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3037 | addbyte(0x0f); /*MOVZX ECX, dither_rb[RCX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3038 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3039 | addbyte(0x0c); | ~~~~~~~~~~~~~~ 3040 | addbyte(0x0e); | ~~~~~~~~~~~~~~ 3041 | addbyte(0x0f); /*MOVZX EAX, dither_rb[RAX+RSI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3042 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3043 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3044 | addbyte(0x06); | ~~~~~~~~~~~~~~ 3045 | addbyte(0xc1); /*SHL EBX, 5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3046 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3047 | addbyte(5); | ~~~~~~~~~~~ 3048 | addbyte(0xc1); /*SHL EAX, 11*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3049 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3050 | addbyte(11); | ~~~~~~~~~~~~ 3051 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3052 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3053 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3054 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3055 | } | ~ 3056 | else | ~~~~ 3057 | { | ~ 3058 | addbyte(0x89); /*MOV EBX, EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3059 | addbyte(0xc3); | ~~~~~~~~~~~~~~ 3060 | addbyte(0x0f); /*MOVZX ECX, AH*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3061 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3062 | addbyte(0xcc); | ~~~~~~~~~~~~~~ 3063 | addbyte(0xc1); /*SHR EAX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3064 | addbyte(0xe8); | ~~~~~~~~~~~~~~ 3065 | addbyte(3); | ~~~~~~~~~~~ 3066 | addbyte(0xc1); /*SHR EBX, 8*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3067 | addbyte(0xeb); | ~~~~~~~~~~~~~~ 3068 | addbyte(8); | ~~~~~~~~~~~ 3069 | addbyte(0xc1); /*SHL ECX, 3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3070 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3071 | addbyte(3); | ~~~~~~~~~~~ 3072 | addbyte(0x81); /*AND EAX, 0x001f*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3073 | addbyte(0xe0); | ~~~~~~~~~~~~~~ 3074 | addlong(0x001f); | ~~~~~~~~~~~~~~~~ 3075 | addbyte(0x81); /*AND EBX, 0xf800*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3076 | addbyte(0xe3); | ~~~~~~~~~~~~~~ 3077 | addlong(0xf800); | ~~~~~~~~~~~~~~~~ 3078 | addbyte(0x81); /*AND ECX, 0x07e0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3079 | addbyte(0xe1); | ~~~~~~~~~~~~~~ 3080 | addlong(0x07e0); | ~~~~~~~~~~~~~~~~ 3081 | addbyte(0x09); /*OR EAX, EBX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3082 | addbyte(0xd8); | ~~~~~~~~~~~~~~ 3083 | addbyte(0x09); /*OR EAX, ECX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3084 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3085 | } | ~ 3086 | addbyte(0x48); /*MOV RSI, fb_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3087 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3088 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3089 | addlong(offsetof(voodoo_state_t, fb_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3090 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3091 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3092 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3093 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3094 | } | ~ 3095 | | 3096 | if ((params->fbzMode & (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) == (FBZ_DEPTH_WMASK | FBZ_DEPTH_ENABLE)) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3097 | { | ~ 3098 | addbyte(0x8b); /*MOV EDX, state->x[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3099 | addbyte(0x97); | ~~~~~~~~~~~~~~ 3100 | if (params->aux_tiled) | ~~~~~~~~~~~~~~~~~~~~~~ 3101 | addlong(offsetof(voodoo_state_t, x_tiled)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3102 | else | ~~~~ 3103 | addlong(offsetof(voodoo_state_t, x)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3104 | addbyte(0x66); /*MOV AX, new_depth*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3105 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3106 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3107 | addlong(offsetof(voodoo_state_t, new_depth)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3108 | addbyte(0x48); /*MOV RSI, aux_mem*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3109 | addbyte(0x8b); | ~~~~~~~~~~~~~~ 3110 | addbyte(0xb7); | ~~~~~~~~~~~~~~ 3111 | addlong(offsetof(voodoo_state_t, aux_mem)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3112 | addbyte(0x66); /*MOV [ESI+EDX*2], AX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3113 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3114 | addbyte(0x04); | ~~~~~~~~~~~~~~ 3115 | addbyte(0x56); | ~~~~~~~~~~~~~~ 3116 | } | ~ 3117 | | 3118 | if (z_skip_pos) | ~~~~~~~~~~~~~~~ 3119 | *(uint32_t *)&code_block[z_skip_pos] = (block_pos - z_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3120 | if (a_skip_pos) | ~~~~~~~~~~~~~~~ 3121 | *(uint32_t *)&code_block[a_skip_pos] = (block_pos - a_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3122 | if (chroma_skip_pos) | ~~~~~~~~~~~~~~~~~~~~ 3123 | *(uint32_t *)&code_block[chroma_skip_pos] = (block_pos - chroma_skip_pos) - 4; | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3124 | | 3125 | addbyte(0x4c); /*MOV RSI, R15*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3126 | addbyte(0x89); | ~~~~~~~~~~~~~~ 3127 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3128 | | 3129 | addbyte(0xf3); /*MOVDQU XMM1, state->ib[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3130 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3131 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3132 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3133 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3134 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu0_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3135 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3136 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3137 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3138 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3139 | addbyte(0xf3); /*MOVQ XMM4, state->tmu0_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3140 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3141 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3142 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3143 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3144 | addbyte(0xf3); /*MOVDQU XMM0, params->dBdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3145 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3146 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3147 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3148 | addlong(offsetof(voodoo_params_t, dBdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3149 | addbyte(0x8b); /*MOV EAX, params->dZdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3150 | addbyte(0x86); | ~~~~~~~~~~~~~~ 3151 | addlong(offsetof(voodoo_params_t, dZdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3152 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[0].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3153 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3154 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3155 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3156 | addlong(offsetof(voodoo_params_t, tmu[0].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3157 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[0].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3158 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3159 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3160 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3161 | addlong(offsetof(voodoo_params_t, tmu[0].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3162 | | 3163 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3164 | { | ~ 3165 | addbyte(0x66); /*PADDD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3166 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3167 | addbyte(0xfe); | ~~~~~~~~~~~~~~ 3168 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3169 | } | ~ 3170 | else | ~~~~ 3171 | { | ~ 3172 | addbyte(0x66); /*PSUBD XMM1, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3173 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3174 | addbyte(0xfa); | ~~~~~~~~~~~~~~ 3175 | addbyte(0xc8); | ~~~~~~~~~~~~~~ 3176 | } | ~ 3177 | | 3178 | addbyte(0xf3); /*MOVQ XMM0, state->w*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3179 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3180 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3181 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3182 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3183 | addbyte(0xf3); /*MOVDQU state->ib, XMM1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3184 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3185 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3186 | addbyte(0x8f); | ~~~~~~~~~~~~~~ 3187 | addlong(offsetof(voodoo_state_t, ib)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3188 | addbyte(0xf3); /*MOVQ XMM7, params->dWdX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3189 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3190 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3191 | addbyte(0xbe); | ~~~~~~~~~~~~~~ 3192 | addlong(offsetof(voodoo_params_t, dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3193 | | 3194 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3195 | { | ~ 3196 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3197 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3198 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3199 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3200 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3201 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3202 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3203 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3204 | addbyte(0x66); /*PADDQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3205 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3206 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3207 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3208 | addbyte(0x01); /*ADD state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3209 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3210 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3211 | } | ~ 3212 | else | ~~~~ 3213 | { | ~ 3214 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3215 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3216 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3217 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3218 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3219 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3220 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3221 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3222 | addbyte(0x66); /*PSUBQ XMM0, XMM7*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3223 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3224 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3225 | addbyte(0xc7); | ~~~~~~~~~~~~~~ 3226 | addbyte(0x29); /*SUB state->z[EDI], EAX*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3227 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3228 | addlong(offsetof(voodoo_state_t, z)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3229 | } | ~ 3230 | | 3231 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3232 | { | ~ 3233 | addbyte(0xf3); /*MOVDQU XMM5, params->tmu[1].dSdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3234 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3235 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3236 | addbyte(0xae); | ~~~~~~~~~~~~~~ 3237 | addlong(offsetof(voodoo_params_t, tmu[1].dSdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3238 | addbyte(0xf3); /*MOVQ XMM6, params->tmu[1].dWdX[ESI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3239 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3240 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3241 | addbyte(0xb6); | ~~~~~~~~~~~~~~ 3242 | addlong(offsetof(voodoo_params_t, tmu[1].dWdX)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3243 | } | ~ 3244 | | 3245 | addbyte(0xf3); /*MOVDQU state->tmu0_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3246 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3247 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3248 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3249 | addlong(offsetof(voodoo_state_t, tmu0_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3250 | addbyte(0x66); /*MOVQ state->tmu0_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3251 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3252 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3253 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3254 | addlong(offsetof(voodoo_state_t, tmu0_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3255 | addbyte(0x66); /*MOVQ state->w, XMM0*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3256 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3257 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3258 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3259 | addlong(offsetof(voodoo_state_t, w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3260 | | 3261 | if (voodoo->dual_tmus) | ~~~~~~~~~~~~~~~~~~~~~~ 3262 | { | ~ 3263 | addbyte(0xf3); /*MOVDQU XMM3, state->tmu1_s[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3264 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3265 | addbyte(0x6f); | ~~~~~~~~~~~~~~ 3266 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3267 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3268 | addbyte(0xf3); /*MOVQ XMM4, state->tmu1_w[EDI]*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3269 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3270 | addbyte(0x7e); | ~~~~~~~~~~~~~~ 3271 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3272 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3273 | | 3274 | if (state->xdir > 0) | ~~~~~~~~~~~~~~~~~~~~ 3275 | { | ~ 3276 | addbyte(0x66); /*PADDQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3277 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3278 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3279 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3280 | addbyte(0x66); /*PADDQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3281 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3282 | addbyte(0xd4); | ~~~~~~~~~~~~~~ 3283 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3284 | } | ~ 3285 | else | ~~~~ 3286 | { | ~ 3287 | addbyte(0x66); /*PSUBQ XMM3, XMM5*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3288 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3289 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3290 | addbyte(0xdd); | ~~~~~~~~~~~~~~ 3291 | addbyte(0x66); /*PSUBQ XMM4, XMM6*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3292 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3293 | addbyte(0xfb); | ~~~~~~~~~~~~~~ 3294 | addbyte(0xe6); | ~~~~~~~~~~~~~~ 3295 | } | ~ 3296 | | 3297 | addbyte(0xf3); /*MOVDQU state->tmu1_s, XMM3*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3298 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3299 | addbyte(0x7f); | ~~~~~~~~~~~~~~ 3300 | addbyte(0x9f); | ~~~~~~~~~~~~~~ 3301 | addlong(offsetof(voodoo_state_t, tmu1_s)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3302 | addbyte(0x66); /*MOVQ state->tmu1_w, XMM4*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3303 | addbyte(0x0f); | ~~~~~~~~~~~~~~ 3304 | addbyte(0xd6); | ~~~~~~~~~~~~~~ 3305 | addbyte(0xa7); | ~~~~~~~~~~~~~~ 3306 | addlong(offsetof(voodoo_state_t, tmu1_w)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3307 | } | ~ 3308 | | 3309 | addbyte(0x83); /*ADD state->pixel_count[EDI], 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3310 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3311 | addlong(offsetof(voodoo_state_t, pixel_count)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3312 | addbyte(1); | ~~~~~~~~~~~ 3313 | | 3314 | if (params->fbzColorPath & FBZCP_TEXTURE_ENABLED) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3315 | { | ~ 3316 | if ((params->textureMode[0] & TEXTUREMODE_MASK) == TEXTUREMODE_PASSTHROUGH || | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3317 | (params->textureMode[0] & TEXTUREMODE_LOCAL_MASK) == TEXTUREMODE_LOCAL) | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3318 | { | ~ 3319 | addbyte(0x83); /*ADD state->texel_count[EDI], 1*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3320 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3321 | addlong(offsetof(voodoo_state_t, texel_count)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3322 | addbyte(1); | ~~~~~~~~~~~ 3323 | } | ~ 3324 | else | ~~~~ 3325 | { | ~ 3326 | addbyte(0x83); /*ADD state->texel_count[EDI], 2*/ | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3327 | addbyte(0x87); | ~~~~~~~~~~~~~~ 3328 | addlong(offsetof(voodoo_state_t, texel_count)); | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 3329 | addbyte(2); | ~~~~~~~~~~~ 3330 | } | ~ 3331 | } | ~ 3332 | | 3333 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ~~~~~~~~~~~~ vid_voodoo_codegen_x86-64.h:3333:9: note: in expansion of macro 'addbyte' 3333 | addbyte(0x8b); /*MOV EAX, state->x[EDI]*/ | ^~~~~~~ vid_voodoo_render.c: In function 'voodoo_triangle': vid_voodoo_codegen_x86-64.h:28:17: note: at offset 0 to object 'code_block' with size 8192 declared here 28 | uint8_t code_block[BLOCK_SIZE]; | ^~~~~~~~~~ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-main.o `test -f 'wx-main.cc' || echo './'`wx-main.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-config_sel.o `test -f 'wx-config_sel.c' || echo './'`wx-config_sel.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-dialogbox.o `test -f 'wx-dialogbox.cc' || echo './'`wx-dialogbox.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-utils.o `test -f 'wx-utils.cc' || echo './'`wx-utils.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-joystick.o `test -f 'wx-sdl2-joystick.c' || echo './'`wx-sdl2-joystick.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-mouse.o `test -f 'wx-sdl2-mouse.c' || echo './'`wx-sdl2-mouse.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-keyboard.o `test -f 'wx-sdl2-keyboard.c' || echo './'`wx-sdl2-keyboard.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-app.o `test -f 'wx-app.cc' || echo './'`wx-app.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-video.o `test -f 'wx-sdl2-video.c' || echo './'`wx-sdl2-video.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2.o `test -f 'wx-sdl2.c' || echo './'`wx-sdl2.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-config.o `test -f 'wx-config.c' || echo './'`wx-config.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-deviceconfig.o `test -f 'wx-deviceconfig.cc' || echo './'`wx-deviceconfig.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-status.o `test -f 'wx-sdl2-status.c' || echo './'`wx-sdl2-status.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-thread.o `test -f 'wx-thread.c' || echo './'`wx-thread.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-common.o `test -f 'wx-common.c' || echo './'`wx-common.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-video-renderer.o `test -f 'wx-sdl2-video-renderer.c' || echo './'`wx-sdl2-video-renderer.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-status.o `test -f 'wx-status.cc' || echo './'`wx-status.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-glslp-parser.o `test -f 'wx-glslp-parser.c' || echo './'`wx-glslp-parser.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-shader_man.o `test -f 'wx-shader_man.c' || echo './'`wx-shader_man.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-video-gl3.o `test -f 'wx-sdl2-video-gl3.c' || echo './'`wx-sdl2-video-gl3.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-shaderconfig.o `test -f 'wx-shaderconfig.cc' || echo './'`wx-shaderconfig.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-joystickconfig.o `test -f 'wx-joystickconfig.cc' || echo './'`wx-joystickconfig.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' wxrc -c pc.xrc -o wx-resources.cpp make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-midi_alsa.o `test -f 'midi_alsa.c' || echo './'`midi_alsa.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_backend_x86-64.o `test -f 'codegen_backend_x86-64.c' || echo './'`codegen_backend_x86-64.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_backend_x86-64_ops.o `test -f 'codegen_backend_x86-64_ops.c' || echo './'`codegen_backend_x86-64_ops.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-createdisc.o `test -f 'wx-createdisc.cc' || echo './'`wx-createdisc.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_backend_x86-64_uops.o `test -f 'codegen_backend_x86-64_uops.c' || echo './'`codegen_backend_x86-64_uops.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-codegen_backend_x86-64_ops_sse.o `test -f 'codegen_backend_x86-64_ops_sse.c' || echo './'`codegen_backend_x86-64_ops_sse.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-nethandler.o `test -f 'nethandler.c' || echo './'`nethandler.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-hostconfig.o `test -f 'wx-hostconfig.c' || echo './'`wx-hostconfig.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-ne2000.o `test -f 'ne2000.c' || echo './'`ne2000.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-cdrom-ioctl-linux.o `test -f 'cdrom-ioctl-linux.c' || echo './'`cdrom-ioctl-linux.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-sdl2-display.o `test -f 'wx-sdl2-display.c' || echo './'`wx-sdl2-display.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o dosbox/pcem-cdrom_image.o `test -f 'dosbox/cdrom_image.cpp' || echo './'`dosbox/cdrom_image.cpp make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o dosbox/pcem-nukedopl.o `test -f 'dosbox/nukedopl.cpp' || echo './'`dosbox/nukedopl.cpp make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o dosbox/pcem-dbopl.o `test -f 'dosbox/dbopl.cpp' || echo './'`dosbox/dbopl.cpp make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-convolve.o `test -f 'resid-fp/convolve.cc' || echo './'`resid-fp/convolve.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-convolve-sse.o `test -f 'resid-fp/convolve-sse.cc' || echo './'`resid-fp/convolve-sse.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o dosbox/pcem-vid_cga_comp.o `test -f 'dosbox/vid_cga_comp.c' || echo './'`dosbox/vid_cga_comp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-envelope.o `test -f 'resid-fp/envelope.cc' || echo './'`resid-fp/envelope.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-extfilt.o `test -f 'resid-fp/extfilt.cc' || echo './'`resid-fp/extfilt.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-pot.o `test -f 'resid-fp/pot.cc' || echo './'`resid-fp/pot.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-filter.o `test -f 'resid-fp/filter.cc' || echo './'`resid-fp/filter.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-voice.o `test -f 'resid-fp/voice.cc' || echo './'`resid-fp/voice.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave6581_PS_.o `test -f 'resid-fp/wave6581_PS_.cc' || echo './'`resid-fp/wave6581_PS_.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave6581_PST.o `test -f 'resid-fp/wave6581_PST.cc' || echo './'`resid-fp/wave6581_PST.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave6581_P_T.o `test -f 'resid-fp/wave6581_P_T.cc' || echo './'`resid-fp/wave6581_P_T.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave6581__ST.o `test -f 'resid-fp/wave6581__ST.cc' || echo './'`resid-fp/wave6581__ST.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave8580_PS_.o `test -f 'resid-fp/wave8580_PS_.cc' || echo './'`resid-fp/wave8580_PS_.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave8580_PST.o `test -f 'resid-fp/wave8580_PST.cc' || echo './'`resid-fp/wave8580_PST.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave8580_P_T.o `test -f 'resid-fp/wave8580_P_T.cc' || echo './'`resid-fp/wave8580_P_T.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave8580__ST.o `test -f 'resid-fp/wave8580__ST.cc' || echo './'`resid-fp/wave8580__ST.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-sid.o `test -f 'resid-fp/sid.cc' || echo './'`resid-fp/sid.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o resid-fp/pcem-wave.o `test -f 'resid-fp/wave.cc' || echo './'`resid-fp/wave.cc make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-libxml2_encoding.o `test -f 'minivhd/libxml2_encoding.c' || echo './'`minivhd/libxml2_encoding.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_convert.o `test -f 'minivhd/minivhd_convert.c' || echo './'`minivhd/minivhd_convert.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_create.o `test -f 'minivhd/minivhd_create.c' || echo './'`minivhd/minivhd_create.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_io.o `test -f 'minivhd/minivhd_io.c' || echo './'`minivhd/minivhd_io.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-cwalk.o `test -f 'minivhd/cwalk.c' || echo './'`minivhd/cwalk.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_manage.o `test -f 'minivhd/minivhd_manage.c' || echo './'`minivhd/minivhd_manage.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_struct_rw.o `test -f 'minivhd/minivhd_struct_rw.c' || echo './'`minivhd/minivhd_struct_rw.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o minivhd/pcem-minivhd_util.o `test -f 'minivhd/minivhd_util.c' || echo './'`minivhd/minivhd_util.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-bootp.o `test -f 'slirp/bootp.c' || echo './'`slirp/bootp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-cksum.o `test -f 'slirp/cksum.c' || echo './'`slirp/cksum.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-debug.o `test -f 'slirp/debug.c' || echo './'`slirp/debug.c In file included from slirp/debug.c:9: slirp/debug.c: In function 'purgesocks': slirp/slirp.h:70:25: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 70 | # define closesocket(s) close(s) | ^~~~~ slirp/debug.c:388:2: note: in expansion of macro 'closesocket' 388 | closesocket(so->s); //close the socket | ^~~~~~~~~~~ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-if.o `test -f 'slirp/if.c' || echo './'`slirp/if.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-ip_icmp.o `test -f 'slirp/ip_icmp.c' || echo './'`slirp/ip_icmp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-ip_input.o `test -f 'slirp/ip_input.c' || echo './'`slirp/ip_input.c slirp/ip_input.c: In function 'ip_reass': slirp/ip_input.c:344:20: warning: initialization of 'struct mbuf *' from incompatible pointer type 'struct SLIRPmbuf *' [-Wincompatible-pointer-types] 344 | struct mbuf *t = dtom(q); | ^~~~ slirp/ip_input.c:346:12: warning: passing argument 2 of 'm_cat' from incompatible pointer type [-Wincompatible-pointer-types] 346 | m_cat(m, t); | ^ | | | struct mbuf * In file included from slirp/ip_input.c:41: slirp/mbuf.h:137:45: note: expected 'struct SLIRPmbuf *' but argument is of type 'struct mbuf *' 137 | void m_cat _P((register struct SLIRPmbuf *, register struct SLIRPmbuf *)); | ^~~~~~~~~~~~~~~~~~~~~~~~~~~ slirp/slirp.h:165:21: note: in definition of macro '_P' 165 | # define _P(x) x | ^ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-ip_output.o `test -f 'slirp/ip_output.c' || echo './'`slirp/ip_output.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-mbuf.o `test -f 'slirp/mbuf.c' || echo './'`slirp/mbuf.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-misc.o `test -f 'slirp/misc.c' || echo './'`slirp/misc.c slirp/misc.c: In function 'getouraddr': slirp/misc.c:95:6: warning: implicit declaration of function 'gethostname'; did you mean 'gethostbyname'? [-Wimplicit-function-declaration] 95 | if (gethostname(&buff,500) == 0) | ^~~~~~~~~~~ | gethostbyname slirp/misc.c:96:32: warning: passing argument 1 of 'gethostbyname' from incompatible pointer type [-Wincompatible-pointer-types] 96 | he = gethostbyname(&buff); | ^~~~~ | | | char (*)[512] In file included from slirp/slirp.h:331, from slirp/misc.c:10: /usr/include/netdb.h:142:51: note: expected 'const char *' but argument is of type 'char (*)[512]' 142 | extern struct hostent *gethostbyname (const char *__name); | ~~~~~~~~~~~~^~~~~~ slirp/misc.c: In function 'slirp_openpty': slirp/misc.c:261:12: warning: implicit declaration of function 'chown' [-Wimplicit-function-declaration] 261 | (void) chown(line, getuid(), 0); | ^~~~~ slirp/misc.c:261:24: warning: implicit declaration of function 'getuid' [-Wimplicit-function-declaration] 261 | (void) chown(line, getuid(), 0); | ^~~~~~ slirp/misc.c:271:12: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 271 | (void) close(master); | ^~~~~ | pclose slirp/misc.c: In function 'fork_exec': slirp/misc.c:338:9: warning: implicit declaration of function 'fork' [-Wimplicit-function-declaration] 338 | switch(fork()) { | ^~~~ slirp/misc.c:379:3: warning: implicit declaration of function 'dup2' [-Wimplicit-function-declaration] 379 | dup2(s, 0); | ^~~~ slirp/misc.c:404:3: warning: implicit declaration of function 'execvp' [-Wimplicit-function-declaration] 404 | execvp(argv[0], argv); | ^~~~~~ slirp/misc.c:412:6: warning: implicit declaration of function 'write'; did you mean 'writev'? [-Wimplicit-function-declaration] 412 | write(2, buff, strlen(buff)+1); | ^~~~~ | writev make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-queue.o `test -f 'slirp/queue.c' || echo './'`slirp/queue.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-sbuf.o `test -f 'slirp/sbuf.c' || echo './'`slirp/sbuf.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-slirp.o `test -f 'slirp/slirp.c' || echo './'`slirp/slirp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-socket.o `test -f 'slirp/socket.c' || echo './'`slirp/socket.c slirp/socket.c: In function 'solisten': slirp/socket.c:598:3: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 598 | close(s); | ^~~~~ | pclose make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-tcp_input.o `test -f 'slirp/tcp_input.c' || echo './'`slirp/tcp_input.c slirp/tcp_input.c: In function 'tcp_reass': slirp/tcp_input.c:169:14: warning: assignment to 'struct mbuf *' from incompatible pointer type 'struct SLIRPmbuf *' [-Wincompatible-pointer-types] 169 | ti->ti_mbuf = m; | ^ In file included from slirp/tcp_var.h:36, from slirp/tcp.h:84, from slirp/slirp.h:265, from slirp/tcp_input.c:42: slirp/tcpip.h:43:32: warning: passing argument 1 of 'm_adj' from incompatible pointer type [-Wincompatible-pointer-types] 43 | #define ti_mbuf ti_i.ih_mbuf.m.mptr slirp/tcp_input.c:182:13: note: in expansion of macro 'ti_mbuf' 182 | m_adj(q->ti_mbuf, i); | ^~~~~~~ In file included from slirp/tcp_input.c:42: slirp/mbuf.h:139:16: note: expected 'struct SLIRPmbuf *' but argument is of type 'struct mbuf *' 139 | void m_adj _P((struct SLIRPmbuf *, int)); | ^~~~~~~~~~~~~~~~~~ slirp/slirp.h:165:21: note: in definition of macro '_P' 165 | # define _P(x) x | ^ slirp/tcp_input.c:186:5: warning: assignment to 'struct SLIRPmbuf *' from incompatible pointer type 'struct mbuf *' [-Wincompatible-pointer-types] 186 | m = tcpiphdr_prev(q)->ti_mbuf; | ^ slirp/tcp_input.c:212:5: warning: assignment to 'struct SLIRPmbuf *' from incompatible pointer type 'struct mbuf *' [-Wincompatible-pointer-types] 212 | m = ti->ti_mbuf; | ^ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-tcp_output.o `test -f 'slirp/tcp_output.c' || echo './'`slirp/tcp_output.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-tcp_subr.o `test -f 'slirp/tcp_subr.c' || echo './'`slirp/tcp_subr.c slirp/tcp_subr.c: In function 'tcp_close': slirp/tcp_subr.c:286:5: warning: assignment to 'struct SLIRPmbuf *' from incompatible pointer type 'struct mbuf *' [-Wincompatible-pointer-types] 286 | m = tcpiphdr_prev(t)->ti_mbuf; | ^ In file included from slirp/tcp_subr.c:43: slirp/slirp.h:70:25: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 70 | # define closesocket(s) close(s) | ^~~~~ slirp/tcp_subr.c:301:2: note: in expansion of macro 'closesocket' 301 | closesocket(so->s); | ^~~~~~~~~~~ make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-tcp_timer.o `test -f 'slirp/tcp_timer.c' || echo './'`slirp/tcp_timer.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-tftp.o `test -f 'slirp/tftp.c' || echo './'`slirp/tftp.c slirp/tftp.c: In function 'tftp_read_data': slirp/tftp.c:113:5: warning: implicit declaration of function 'lseek'; did you mean 'fseek'? [-Wimplicit-function-declaration] 113 | lseek(fd, block_nr * 512, SEEK_SET); | ^~~~~ | fseek slirp/tftp.c:115:18: warning: implicit declaration of function 'read'; did you mean 'readv'? [-Wimplicit-function-declaration] 115 | bytes_read = read(fd, buf, len); | ^~~~ | readv slirp/tftp.c:118:3: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 118 | close(fd); | ^~~~~ | pclose make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o pcem-wx-resources.o `test -f 'wx-resources.cpp' || echo './'`wx-resources.cpp make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' gcc -DPACKAGE_NAME=\"PCem\" -DPACKAGE_TARNAME=\"pcem\" -DPACKAGE_VERSION=\"v17\" -DPACKAGE_STRING=\"PCem\ v17\" -DPACKAGE_BUGREPORT=\"Sarah\ Walker\ \\" -DPACKAGE_URL=\"\" -DPACKAGE=\"pcem\" -DVERSION=\"v17\" -DHAVE_LIBASOUND=1 -DHAVE_LIBPTHREAD=1 -DHAVE_LIBGL=1 -DHAVE_LIBOPENAL=1 -I. -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -c -o slirp/pcem-udp.o `test -f 'slirp/udp.c' || echo './'`slirp/udp.c make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' In file included from slirp/udp.c:42: slirp/udp.c: In function 'udp_attach': slirp/slirp.h:70:25: warning: implicit declaration of function 'close'; did you mean 'pclose'? [-Wimplicit-function-declaration] 70 | # define closesocket(s) close(s) | ^~~~~ slirp/udp.c:341:7: note: in expansion of macro 'closesocket' 341 | closesocket(so->s); | ^~~~~~~~~~~ make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' g++ -I/usr/lib64/wx/include/gtk3-unicode-3.0 -I/usr/include/wx-3.0 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -I/usr/include/SDL2 -D_REENTRANT -DUSE_NETWORKING -DRELEASE_BUILD -O3 -g -fcommon -Wl,-z,relro -Wl,--as-needed -o pcem pcem-386.o pcem-386_common.o pcem-386_dynarec.o pcem-386_dynarec_ops.o pcem-808x.o pcem-82091aa.o pcem-acc2036.o pcem-acc2168.o pcem-acc3221.o pcem-acer386sx.o pcem-ali1429.o pcem-amstrad.o pcem-cassette.o pcem-cbm_io.o pcem-cdrom-image.o pcem-cdrom-null.o pcem-cmd640.o pcem-codegen.o pcem-codegen_accumulate.o pcem-codegen_allocator.o pcem-codegen_block.o pcem-codegen_ir.o pcem-codegen_ops.o pcem-codegen_ops_3dnow.o pcem-codegen_ops_arith.o pcem-codegen_ops_branch.o pcem-codegen_ops_fpu_arith.o pcem-codegen_ops_fpu_constant.o pcem-codegen_ops_fpu_loadstore.o pcem-codegen_ops_fpu_misc.o pcem-codegen_ops_mmx_arith.o pcem-codegen_ops_mmx_cmp.o pcem-codegen_ops_mmx_loadstore.o pcem-codegen_ops_mmx_logic.o pcem-codegen_ops_mmx_pack.o pcem-codegen_ops_mmx_shift.o pcem-codegen_ops_helpers.o pcem-codegen_ops_jump.o pcem-codegen_ops_logic.o pcem-codegen_ops_shift.o pcem-codegen_ops_misc.o pcem-codegen_ops_mov.o pcem-codegen_ops_stack.o pcem-codegen_reg.o pcem-codegen_timing_486.o pcem-codegen_timing_686.o pcem-codegen_timing_common.o pcem-codegen_timing_cyrixiii.o pcem-codegen_timing_k6.o pcem-codegen_timing_p6.o pcem-codegen_timing_pentium.o pcem-codegen_timing_winchip.o pcem-codegen_timing_winchip2.o pcem-compaq.o pcem-config.o pcem-cpu.o pcem-cpu_tables.o pcem-cs8230.o pcem-dells200.o pcem-device.o pcem-disc.o pcem-disc_fdi.o pcem-disc_img.o pcem-disc_sector.o pcem-dma.o pcem-esdi_at.o pcem-f82c710_upc.o pcem-fdc.o pcem-fdc37c665.o pcem-fdc37c93x.o pcem-fdd.o pcem-fdi2raw.o pcem-gameport.o pcem-hdd.o pcem-hdd_esdi.o pcem-hdd_file.o pcem-headland.o pcem-i430lx.o pcem-i430fx.o pcem-i430hx.o pcem-i430vx.o pcem-i440fx.o pcem-i440bx.o pcem-ide.o pcem-ide_atapi.o pcem-ide_sff8038i.o pcem-intel.o pcem-intel_flash.o pcem-io.o pcem-jim.o pcem-joystick_ch_flightstick_pro.o pcem-joystick_standard.o pcem-joystick_sw_pad.o pcem-joystick_tm_fcs.o pcem-keyboard.o pcem-keyboard_amstrad.o pcem-keyboard_at.o pcem-keyboard_olim24.o pcem-keyboard_pcjr.o pcem-keyboard_xt.o pcem-laserxt.o pcem-lpt.o pcem-lpt_dac.o pcem-lpt_dss.o pcem-mca.o pcem-mcr.o pcem-mem.o pcem-mem_bios.o pcem-mfm_at.o pcem-mfm_xebec.o pcem-model.o pcem-mouse.o pcem-mouse_msystems.o pcem-mouse_ps2.o pcem-mouse_serial.o pcem-mvp3.o pcem-neat.o pcem-nmi.o pcem-nvr.o pcem-olivetti_m24.o pcem-opti495.o pcem-paths.o pcem-pc.o pcem-pc87306.o pcem-pc87307.o pcem-pci.o pcem-pic.o pcem-piix.o pcem-piix_pm.o pcem-pit.o pcem-ppi.o pcem-ps1.o pcem-ps2.o pcem-ps2_mca.o pcem-ps2_nvr.o pcem-nvr_tc8521.o pcem-pzx.o pcem-rom.o pcem-rtc.o pcem-rtc_tc8521.o pcem-scamp.o pcem-scat.o pcem-scsi.o pcem-scsi_53c400.o pcem-scsi_aha1540.o pcem-scsi_cd.o pcem-scsi_hd.o pcem-scsi_ibm.o pcem-scsi_zip.o pcem-serial.o pcem-sio.o pcem-sis496.o pcem-sl82c460.o pcem-sound.o pcem-sound_ad1848.o pcem-sound_adlib.o pcem-sound_adlibgold.o pcem-sound_audiopci.o pcem-sound_azt2316a.o pcem-sound_cms.o pcem-sound_emu8k.o pcem-sound_gus.o pcem-sound_mpu401_uart.o pcem-sound_opl.o pcem-sound_pas16.o pcem-sound_ps1.o pcem-sound_pssj.o pcem-sound_sb.o pcem-sound_sb_dsp.o pcem-sound_sn76489.o pcem-sound_speaker.o pcem-sound_ssi2001.o pcem-sound_wss.o pcem-sound_ym7128.o pcem-soundopenal.o pcem-sst39sf010.o pcem-superxt.o pcem-tandy_eeprom.o pcem-tandy_rom.o pcem-t1000.o pcem-t3100e.o pcem-timer.o pcem-um8669f.o pcem-um8881f.o pcem-vid_ati_eeprom.o pcem-vid_ati_mach64.o pcem-vid_ati18800.o pcem-vid_ati28800.o pcem-vid_ati68860_ramdac.o pcem-vid_cga.o pcem-vid_cl5429.o pcem-vid_colorplus.o pcem-vid_compaq_cga.o pcem-vid_ddc.o pcem-vid_ega.o pcem-vid_et4000.o pcem-vid_et4000w32.o pcem-vid_genius.o pcem-vid_hercules.o pcem-vid_ht216.o pcem-vid_icd2061.o pcem-vid_ics2595.o pcem-vid_im1024.o pcem-vid_incolor.o pcem-vid_mda.o pcem-vid_mga.o pcem-vid_olivetti_m24.o pcem-vid_oti037.o pcem-vid_oti067.o pcem-vid_paradise.o pcem-vid_pc200.o pcem-vid_pc1512.o pcem-vid_pc1640.o pcem-vid_pcjr.o pcem-vid_pgc.o pcem-vid_ps1_svga.o pcem-vid_s3.o pcem-vid_s3_virge.o pcem-vid_sdac_ramdac.o pcem-vid_sigma.o pcem-vid_stg_ramdac.o pcem-vid_svga.o pcem-vid_svga_render.o pcem-vid_t1000.o pcem-vid_t3100e.o pcem-vid_tandy.o pcem-vid_tandysl.o pcem-vid_tgui9440.o pcem-vid_tkd8001_ramdac.o pcem-vid_tvga.o pcem-vid_unk_ramdac.o pcem-vid_vga.o pcem-vid_voodoo.o pcem-vid_voodoo_banshee.o pcem-vid_voodoo_banshee_blitter.o pcem-vid_voodoo_blitter.o pcem-vid_voodoo_display.o pcem-vid_voodoo_fb.o pcem-vid_voodoo_fifo.o pcem-vid_voodoo_reg.o pcem-vid_voodoo_render.o pcem-vid_voodoo_setup.o pcem-vid_voodoo_texture.o pcem-video.o pcem-wd76c10.o pcem-vid_wy700.o pcem-vt82c586b.o pcem-vl82c480.o pcem-w83877tf.o pcem-w83977tf.o pcem-x86seg.o pcem-x87.o pcem-x87_timings.o pcem-xi8088.o pcem-xtide.o pcem-sound_dbopl.o pcem-sound_resid.o dosbox/pcem-cdrom_image.o dosbox/pcem-dbopl.o dosbox/pcem-nukedopl.o dosbox/pcem-vid_cga_comp.o resid-fp/pcem-convolve.o resid-fp/pcem-convolve-sse.o resid-fp/pcem-envelope.o resid-fp/pcem-extfilt.o resid-fp/pcem-filter.o resid-fp/pcem-pot.o resid-fp/pcem-sid.o resid-fp/pcem-voice.o resid-fp/pcem-wave6581_PS_.o resid-fp/pcem-wave6581_PST.o resid-fp/pcem-wave6581_P_T.o resid-fp/pcem-wave6581__ST.o resid-fp/pcem-wave8580_PS_.o resid-fp/pcem-wave8580_PST.o resid-fp/pcem-wave8580_P_T.o resid-fp/pcem-wave8580__ST.o resid-fp/pcem-wave.o minivhd/pcem-cwalk.o minivhd/pcem-libxml2_encoding.o minivhd/pcem-minivhd_convert.o minivhd/pcem-minivhd_create.o minivhd/pcem-minivhd_io.o minivhd/pcem-minivhd_manage.o minivhd/pcem-minivhd_struct_rw.o minivhd/pcem-minivhd_util.o pcem-wx-main.o pcem-wx-config_sel.o pcem-wx-dialogbox.o pcem-wx-utils.o pcem-wx-app.o pcem-wx-sdl2-joystick.o pcem-wx-sdl2-mouse.o pcem-wx-sdl2-keyboard.o pcem-wx-sdl2-video.o pcem-wx-sdl2.o pcem-wx-config.o pcem-wx-deviceconfig.o pcem-wx-status.o pcem-wx-sdl2-status.o pcem-wx-thread.o pcem-wx-common.o pcem-wx-sdl2-video-renderer.o pcem-wx-sdl2-video-gl3.o pcem-wx-glslp-parser.o pcem-wx-shader_man.o pcem-wx-shaderconfig.o pcem-wx-joystickconfig.o pcem-wx-createdisc.o pcem-wx-resources.o pcem-midi_alsa.o pcem-codegen_backend_x86-64.o pcem-codegen_backend_x86-64_ops.o pcem-codegen_backend_x86-64_ops_sse.o pcem-codegen_backend_x86-64_uops.o pcem-ne2000.o pcem-nethandler.o pcem-wx-hostconfig.o slirp/pcem-bootp.o slirp/pcem-cksum.o slirp/pcem-debug.o slirp/pcem-if.o slirp/pcem-ip_icmp.o slirp/pcem-ip_input.o slirp/pcem-ip_output.o slirp/pcem-mbuf.o slirp/pcem-misc.o slirp/pcem-queue.o slirp/pcem-sbuf.o slirp/pcem-slirp.o slirp/pcem-socket.o slirp/pcem-tcp_input.o slirp/pcem-tcp_output.o slirp/pcem-tcp_subr.o slirp/pcem-tcp_timer.o slirp/pcem-tftp.o slirp/pcem-udp.o pcem-cdrom-ioctl-linux.o pcem-wx-sdl2-display.o -lopenal -lGL -lpthread -lasound -pthread -lwx_gtk3u_xrc-3.0 -lwx_gtk3u_webview-3.0 -lwx_gtk3u_html-3.0 -lwx_gtk3u_qa-3.0 -lwx_gtk3u_adv-3.0 -lwx_gtk3u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0 -lSDL2 -lasound -lopenal -lGL -lpthread -lasound -pthread -lwx_gtk3u_xrc-3.0 -lwx_gtk3u_webview-3.0 -lwx_gtk3u_html-3.0 -lwx_gtk3u_qa-3.0 -lwx_gtk3u_adv-3.0 -lwx_gtk3u_core-3.0 -lwx_baseu_xml-3.0 -lwx_baseu_net-3.0 -lwx_baseu-3.0 -lSDL2 make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' cp pcem .. make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Nothing to be done for 'all-am'. + RPM_EC=0 ++ jobs -p + exit 0 Executing(%install): /bin/sh -e /var/tmp/rpm-tmp.L3y2sx + umask 022 + cd /builddir/build/BUILD + '[' /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 '!=' / ']' + rm -rf /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 ++ dirname /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 + mkdir -p /builddir/build/BUILDROOT + mkdir /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 + cd pcem-17 + /usr/bin/make install DESTDIR=/builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 'INSTALL=/usr/bin/install -p' Making install in src make[1]: Entering directory '/builddir/build/BUILD/pcem-17/src' make[2]: Entering directory '/builddir/build/BUILD/pcem-17/src' /usr/bin/mkdir -p '/builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/bin' /usr/bin/install -p pcem '/builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/bin' make[2]: Nothing to be done for 'install-data-am'. make[2]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Leaving directory '/builddir/build/BUILD/pcem-17/src' make[1]: Entering directory '/builddir/build/BUILD/pcem-17' make[2]: Entering directory '/builddir/build/BUILD/pcem-17' make[2]: Nothing to be done for 'install-exec-am'. make[2]: Nothing to be done for 'install-data-am'. make[2]: Leaving directory '/builddir/build/BUILD/pcem-17' make[1]: Leaving directory '/builddir/build/BUILD/pcem-17' + desktop-file-install --dir=/builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/applications /builddir/build/SOURCES/pcem.desktop + mkdir -p /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/metainfo + cp /builddir/build/SOURCES/pcem.appdata.xml /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/metainfo + appstream-util validate-relax --nonet /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/metainfo/pcem.appdata.xml /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/metainfo/pcem.appdata.xml: OK + /usr/lib/rpm/find-debuginfo.sh -j2 --strict-build-id -m -i --build-id-seed 17-1.fc34 --unique-debug-suffix -17-1.fc34.x86_64 --unique-debug-src-base pcem-17-1.fc34.x86_64 --run-dwz --dwz-low-mem-die-limit 10000000 --dwz-max-die-limit 110000000 -S debugsourcefiles.list /builddir/build/BUILD/pcem-17 explicitly decompress any DWARF compressed ELF sections in /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/bin/pcem extracting debug info from /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/bin/pcem original debug info size: 23324kB, size after compression: 19816kB /usr/lib/rpm/sepdebugcrcfix: Updated 1 CRC32s, 0 CRC32s did match. 20912 blocks + /usr/lib/rpm/check-buildroot + /usr/lib/rpm/redhat/brp-ldconfig + /usr/lib/rpm/brp-compress + /usr/lib/rpm/redhat/brp-strip-lto /usr/bin/strip + /usr/lib/rpm/brp-strip-static-archive /usr/bin/strip + /usr/lib/rpm/redhat/brp-python-bytecompile '' 1 0 + /usr/lib/rpm/brp-python-hardlink + /usr/lib/rpm/redhat/brp-mangle-shebangs Processing files: pcem-17-1.fc34.x86_64 Executing(%license): /bin/sh -e /var/tmp/rpm-tmp.wqvf3u + umask 022 + cd /builddir/build/BUILD + cd pcem-17 + LICENSEDIR=/builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/licenses/pcem + export LC_ALL=C + LC_ALL=C + export LICENSEDIR + /usr/bin/mkdir -p /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/licenses/pcem + cp -pr COPYING /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64/usr/share/licenses/pcem + RPM_EC=0 ++ jobs -p + exit 0 Provides: application() application(pcem.desktop) metainfo() metainfo(pcem.appdata.xml) pcem = 17-1.fc34 pcem(x86-64) = 17-1.fc34 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Requires: libGL.so.1()(64bit) libSDL2-2.0.so.0()(64bit) libasound.so.2()(64bit) libasound.so.2(ALSA_0.9)(64bit) libc.so.6()(64bit) libc.so.6(GLIBC_2.14)(64bit) libc.so.6(GLIBC_2.17)(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.28)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.2)(64bit) libc.so.6(GLIBC_2.33)(64bit) libc.so.6(GLIBC_2.7)(64bit) libgcc_s.so.1()(64bit) libgcc_s.so.1(GCC_3.0)(64bit) libm.so.6()(64bit) libm.so.6(GLIBC_2.2.5)(64bit) libm.so.6(GLIBC_2.27)(64bit) libm.so.6(GLIBC_2.29)(64bit) libopenal.so.1()(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) libpthread.so.0(GLIBC_2.3.2)(64bit) libstdc++.so.6()(64bit) libstdc++.so.6(CXXABI_1.3)(64bit) libstdc++.so.6(CXXABI_1.3.8)(64bit) libstdc++.so.6(CXXABI_1.3.9)(64bit) libstdc++.so.6(GLIBCXX_3.4)(64bit) libstdc++.so.6(GLIBCXX_3.4.11)(64bit) libstdc++.so.6(GLIBCXX_3.4.20)(64bit) libstdc++.so.6(GLIBCXX_3.4.21)(64bit) libstdc++.so.6(GLIBCXX_3.4.9)(64bit) libwx_baseu-3.0.so.0()(64bit) libwx_baseu-3.0.so.0(WXU_3.0)(64bit) libwx_gtk3u_core-3.0.so.0()(64bit) libwx_gtk3u_core-3.0.so.0(WXU_3.0)(64bit) libwx_gtk3u_core-3.0.so.0(WXU_3.0.5)(64bit) libwx_gtk3u_xrc-3.0.so.0()(64bit) libwx_gtk3u_xrc-3.0.so.0(WXU_3.0)(64bit) rtld(GNU_HASH) Processing files: pcem-debugsource-17-1.fc34.x86_64 Provides: pcem-debugsource = 17-1.fc34 pcem-debugsource(x86-64) = 17-1.fc34 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Processing files: pcem-debuginfo-17-1.fc34.x86_64 Provides: debuginfo(build-id) = 5797cfd09b4af9e98592a17acd474f93a50bb6c0 pcem-debuginfo = 17-1.fc34 pcem-debuginfo(x86-64) = 17-1.fc34 Requires(rpmlib): rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 Recommends: pcem-debugsource(x86-64) = 17-1.fc34 Checking for unpackaged file(s): /usr/lib/rpm/check-files /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 Wrote: /builddir/build/RPMS/pcem-debugsource-17-1.fc34.x86_64.rpm Wrote: /builddir/build/RPMS/pcem-17-1.fc34.x86_64.rpm Wrote: /builddir/build/RPMS/pcem-debuginfo-17-1.fc34.x86_64.rpm Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.DXIBvw + umask 022 + cd /builddir/build/BUILD + cd pcem-17 + /usr/bin/rm -rf /builddir/build/BUILDROOT/pcem-17-1.fc34.x86_64 + RPM_EC=0 ++ jobs -p + exit 0 Finish: rpmbuild pcem-17-1.fc34.src.rpm Finish: build phase for pcem-17-1.fc34.src.rpm INFO: chroot_scan: 3 files copied to /var/lib/copr-rpmbuild/results/chroot_scan INFO: /var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root/var/log/dnf.rpm.log /var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root/var/log/dnf.librepo.log /var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root/var/log/dnf.log INFO: Done(/var/lib/copr-rpmbuild/results/pcem-17-1.fc34.src.rpm) Config(child) 4 minutes 6 seconds INFO: Results and/or logs in: /var/lib/copr-rpmbuild/results INFO: Cleaning up build root ('cleanup_on_success=True') Start: clean chroot INFO: unmounting tmpfs. Finish: clean chroot Finish: run