Mock Version: 2.6 ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bs --target x86_64 --nodeps /builddir/build/SPECS/pcem.spec'], chrootPath='/var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'C.UTF-8'}shell=Falselogger=timeout=0uid=1001gid=135user='mockbuild'nspawn_args=['--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11']unshare_net=TrueprintOutput=True) Using nspawn with args ['--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11'] Executing command: ['/usr/bin/systemd-nspawn', '-q', '-M', '1d35d046d329489ebec589e0f10449ce', '-D', '/var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root', '-a', '-u', 'mockbuild', '--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11', '--console=pipe', '--setenv=TERM=vt100', '--setenv=SHELL=/bin/bash', '--setenv=HOME=/builddir', '--setenv=HOSTNAME=mock', '--setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin', '--setenv=PROMPT_COMMAND=printf "\\033]0;\\007"', '--setenv=PS1= \\s-\\v\\$ ', '--setenv=LANG=C.UTF-8', '--resolv-conf=off', 'bash', '--login', '-c', '/usr/bin/rpmbuild -bs --target x86_64 --nodeps /builddir/build/SPECS/pcem.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'C.UTF-8', 'SYSTEMD_NSPAWN_TMPFS_TMP': '0'} and shell False 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 Child return code was: 0 ENTER ['do_with_status'](['bash', '--login', '-c', '/usr/bin/rpmbuild -bb --target x86_64 --nodeps /builddir/build/SPECS/pcem.spec'], chrootPath='/var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root'env={'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'C.UTF-8'}shell=Falselogger=timeout=0uid=1001gid=135user='mockbuild'nspawn_args=['--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11']unshare_net=TrueprintOutput=True) Using nspawn with args ['--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11'] Executing command: ['/usr/bin/systemd-nspawn', '-q', '-M', 'daccf9a390a6470d878e062e17c2f465', '-D', '/var/lib/mock/fedora-rawhide-x86_64-1607008712.827806/root', '-a', '-u', 'mockbuild', '--capability=cap_ipc_lock', '--rlimit=RLIMIT_NOFILE=10240', '--capability=cap_ipc_lock', '--bind=/tmp/mock-resolv.ysmabri0:/etc/resolv.conf', '--bind=/dev/btrfs-control', '--bind=/dev/loop-control', '--bind=/dev/loop0', '--bind=/dev/loop1', '--bind=/dev/loop2', '--bind=/dev/loop3', '--bind=/dev/loop4', '--bind=/dev/loop5', '--bind=/dev/loop6', '--bind=/dev/loop7', '--bind=/dev/loop8', '--bind=/dev/loop9', '--bind=/dev/loop10', '--bind=/dev/loop11', '--console=pipe', '--setenv=TERM=vt100', '--setenv=SHELL=/bin/bash', '--setenv=HOME=/builddir', '--setenv=HOSTNAME=mock', '--setenv=PATH=/usr/bin:/bin:/usr/sbin:/sbin', '--setenv=PROMPT_COMMAND=printf "\\033]0;\\007"', '--setenv=PS1= \\s-\\v\\$ ', '--setenv=LANG=C.UTF-8', '--resolv-conf=off', 'bash', '--login', '-c', '/usr/bin/rpmbuild -bb --target x86_64 --nodeps /builddir/build/SPECS/pcem.spec'] with env {'TERM': 'vt100', 'SHELL': '/bin/bash', 'HOME': '/builddir', 'HOSTNAME': 'mock', 'PATH': '/usr/bin:/bin:/usr/sbin:/sbin', 'PROMPT_COMMAND': 'printf "\\033]0;\\007"', 'PS1': ' \\s-\\v\\$ ', 'LANG': 'C.UTF-8', 'SYSTEMD_NSPAWN_TMPFS_TMP': '0'} and shell False 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 Child return code was: 0