From 3acc8c5a1701cd8a12a681ed231bd2bb7277dae2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Nov 2024 03:24:54 +0000 Subject: [PATCH] Bump github.com/ncruces/go-sqlite3 from 0.15.0 to 0.20.2 Bumps [github.com/ncruces/go-sqlite3](https://github.com/ncruces/go-sqlite3) from 0.15.0 to 0.20.2. - [Release notes](https://github.com/ncruces/go-sqlite3/releases) - [Commits](https://github.com/ncruces/go-sqlite3/compare/v0.15.0...v0.20.2) --- updated-dependencies: - dependency-name: github.com/ncruces/go-sqlite3 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 14 +- go.sum | 28 +- .../github.com/ncruces/go-sqlite3/README.md | 65 +- vendor/github.com/ncruces/go-sqlite3/blob.go | 53 +- .../github.com/ncruces/go-sqlite3/config.go | 249 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 211 +- .../ncruces/go-sqlite3/conn_iter.go | 11 + .../github.com/ncruces/go-sqlite3/conn_old.go | 9 + vendor/github.com/ncruces/go-sqlite3/const.go | 79 +- .../github.com/ncruces/go-sqlite3/context.go | 29 +- .../ncruces/go-sqlite3/driver/driver.go | 305 +- .../ncruces/go-sqlite3/driver/savepoint.go | 21 +- .../ncruces/go-sqlite3/embed/README.md | 23 +- .../ncruces/go-sqlite3/embed/build.sh | 16 +- .../ncruces/go-sqlite3/embed/exports.txt | 28 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1337796 -> 1401377 bytes vendor/github.com/ncruces/go-sqlite3/error.go | 10 + vendor/github.com/ncruces/go-sqlite3/func.go | 34 +- .../github.com/ncruces/go-sqlite3/go.work.sum | 15 +- .../go-sqlite3/internal/alloc/alloc_other.go | 24 + .../{util/alloc.go => alloc/alloc_unix.go} | 22 +- .../internal/alloc/alloc_windows.go | 76 + .../ncruces/go-sqlite3/internal/util/bool.go | 22 - .../ncruces/go-sqlite3/internal/util/const.go | 2 +- .../ncruces/go-sqlite3/internal/util/error.go | 10 + .../ncruces/go-sqlite3/internal/util/func.go | 12 + .../go-sqlite3/internal/util/handle.go | 9 +- .../ncruces/go-sqlite3/internal/util/json.go | 2 +- .../ncruces/go-sqlite3/internal/util/math.go | 29 + .../ncruces/go-sqlite3/internal/util/mmap.go | 40 +- .../go-sqlite3/internal/util/mmap_other.go | 8 +- .../go-sqlite3/internal/util/mmap_windows.go | 53 + .../go-sqlite3/internal/util/module.go | 4 +- .../ncruces/go-sqlite3/internal/util/set.go | 12 + vendor/github.com/ncruces/go-sqlite3/json.go | 3 +- .../github.com/ncruces/go-sqlite3/pointer.go | 3 +- vendor/github.com/ncruces/go-sqlite3/quote.go | 50 +- .../github.com/ncruces/go-sqlite3/registry.go | 30 + .../github.com/ncruces/go-sqlite3/sqlite.go | 69 +- vendor/github.com/ncruces/go-sqlite3/stmt.go | 151 +- vendor/github.com/ncruces/go-sqlite3/time.go | 15 +- vendor/github.com/ncruces/go-sqlite3/txn.go | 54 +- .../go-sqlite3/util/osutil/open_windows.go | 2 +- .../ncruces/go-sqlite3/util/osutil/osutil.go | 2 +- .../go-sqlite3/util/sql3util/README.md | 9 + .../ncruces/go-sqlite3/util/sql3util/arg.go | 65 + .../ncruces/go-sqlite3/util/sql3util/const.go | 61 + .../ncruces/go-sqlite3/util/sql3util/parse.go | 210 + .../util/sql3util/parse/sql3parse_table.wasm | Bin 0 -> 17538 bytes .../go-sqlite3/util/sql3util/sql3util.go | 9 + vendor/github.com/ncruces/go-sqlite3/value.go | 14 +- .../ncruces/go-sqlite3/vfs/README.md | 105 +- .../github.com/ncruces/go-sqlite3/vfs/api.go | 84 +- .../github.com/ncruces/go-sqlite3/vfs/cksm.go | 149 + .../ncruces/go-sqlite3/vfs/const.go | 7 + .../github.com/ncruces/go-sqlite3/vfs/file.go | 36 +- .../ncruces/go-sqlite3/vfs/filename.go | 11 +- .../github.com/ncruces/go-sqlite3/vfs/lock.go | 17 +- .../ncruces/go-sqlite3/vfs/lock_other.go | 2 +- .../ncruces/go-sqlite3/vfs/os_bsd.go | 58 +- .../ncruces/go-sqlite3/vfs/os_darwin.go | 6 +- .../ncruces/go-sqlite3/vfs/os_dotlk.go | 143 + .../ncruces/go-sqlite3/vfs/os_f2fs_linux.go | 5 +- .../ncruces/go-sqlite3/vfs/os_linux.go | 7 +- .../ncruces/go-sqlite3/vfs/os_ofd.go | 59 + .../vfs/{os_std_access.go => os_std.go} | 11 + .../ncruces/go-sqlite3/vfs/os_std_mode.go | 14 - .../ncruces/go-sqlite3/vfs/os_std_sleep.go | 9 - .../ncruces/go-sqlite3/vfs/os_unix.go | 40 + .../ncruces/go-sqlite3/vfs/os_unix_lock.go | 103 - .../ncruces/go-sqlite3/vfs/os_windows.go | 51 +- .../github.com/ncruces/go-sqlite3/vfs/shm.go | 151 +- .../ncruces/go-sqlite3/vfs/shm_bsd.go | 231 + .../ncruces/go-sqlite3/vfs/shm_copy.go | 84 + .../ncruces/go-sqlite3/vfs/shm_dotlk.go | 224 + .../ncruces/go-sqlite3/vfs/shm_ofd.go | 168 + .../ncruces/go-sqlite3/vfs/shm_other.go | 2 +- .../ncruces/go-sqlite3/vfs/shm_windows.go | 182 + .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 85 +- vendor/github.com/ncruces/go-sqlite3/vtab.go | 51 +- .../tetratelabs/wazero/experimental/memory.go | 2 + .../wazero/internal/descriptor/table.go | 40 +- .../engine/interpreter/interpreter.go | 2 +- .../internal/engine/wazevo/module_engine.go | 28 +- .../wazero/internal/sysfs/dirfs_supported.go | 6 + .../tetratelabs/wazero/internal/sysfs/file.go | 34 +- .../wazero/internal/sysfs/osfile.go | 44 +- .../wazero/internal/wasm/engine.go | 3 +- .../wazero/internal/wasm/memory.go | 6 +- .../tetratelabs/wazero/internal/wasm/store.go | 2 +- .../github.com/tetratelabs/wazero/sys/stat.go | 4 +- vendor/golang.org/x/crypto/LICENSE | 4 +- .../golang.org/x/crypto/argon2/blamka_amd64.s | 2972 +++- .../x/crypto/blake2b/blake2bAVX2_amd64.s | 5167 ++++++- .../x/crypto/blake2b/blake2b_amd64.s | 1681 ++- .../x/crypto/blake2s/blake2s_amd64.s | 2571 +++- .../chacha20poly1305/chacha20poly1305_amd64.s | 11503 +++++++++++++--- .../x/crypto/internal/poly1305/sum_amd64.s | 133 +- .../x/crypto/salsa20/salsa/salsa20_amd64.s | 1742 +-- .../golang.org/x/crypto/ssh/agent/keyring.go | 9 + vendor/golang.org/x/crypto/ssh/keys.go | 44 +- vendor/golang.org/x/crypto/ssh/server.go | 4 +- vendor/golang.org/x/sync/LICENSE | 4 +- vendor/golang.org/x/sys/LICENSE | 4 +- vendor/golang.org/x/sys/cpu/cpu.go | 21 + vendor/golang.org/x/sys/cpu/cpu_arm64.go | 12 + .../golang.org/x/sys/cpu/cpu_linux_arm64.go | 5 + .../golang.org/x/sys/cpu/cpu_linux_noinit.go | 2 +- .../golang.org/x/sys/cpu/cpu_linux_riscv64.go | 137 + vendor/golang.org/x/sys/cpu/cpu_riscv64.go | 11 +- vendor/golang.org/x/sys/unix/README.md | 2 +- vendor/golang.org/x/sys/unix/mkerrors.sh | 6 +- vendor/golang.org/x/sys/unix/syscall_aix.go | 2 +- .../golang.org/x/sys/unix/syscall_darwin.go | 49 + vendor/golang.org/x/sys/unix/syscall_hurd.go | 1 + vendor/golang.org/x/sys/unix/syscall_linux.go | 64 +- .../x/sys/unix/syscall_linux_arm64.go | 2 + .../x/sys/unix/syscall_linux_loong64.go | 2 + .../x/sys/unix/syscall_linux_riscv64.go | 2 + .../golang.org/x/sys/unix/syscall_openbsd.go | 1 + .../golang.org/x/sys/unix/vgetrandom_linux.go | 13 + .../x/sys/unix/vgetrandom_unsupported.go | 11 + .../x/sys/unix/zerrors_darwin_amd64.go | 12 + .../x/sys/unix/zerrors_darwin_arm64.go | 12 + vendor/golang.org/x/sys/unix/zerrors_linux.go | 51 +- .../x/sys/unix/zerrors_linux_386.go | 7 + .../x/sys/unix/zerrors_linux_amd64.go | 7 + .../x/sys/unix/zerrors_linux_arm.go | 7 + .../x/sys/unix/zerrors_linux_arm64.go | 7 + .../x/sys/unix/zerrors_linux_loong64.go | 7 + .../x/sys/unix/zerrors_linux_mips.go | 7 + .../x/sys/unix/zerrors_linux_mips64.go | 7 + .../x/sys/unix/zerrors_linux_mips64le.go | 7 + .../x/sys/unix/zerrors_linux_mipsle.go | 7 + .../x/sys/unix/zerrors_linux_ppc.go | 7 + .../x/sys/unix/zerrors_linux_ppc64.go | 7 + .../x/sys/unix/zerrors_linux_ppc64le.go | 7 + .../x/sys/unix/zerrors_linux_riscv64.go | 7 + .../x/sys/unix/zerrors_linux_s390x.go | 7 + .../x/sys/unix/zerrors_linux_sparc64.go | 7 + .../x/sys/unix/zerrors_zos_s390x.go | 2 + .../x/sys/unix/zsyscall_darwin_amd64.go | 68 + .../x/sys/unix/zsyscall_darwin_amd64.s | 15 + .../x/sys/unix/zsyscall_darwin_arm64.go | 68 + .../x/sys/unix/zsyscall_darwin_arm64.s | 15 + .../golang.org/x/sys/unix/zsyscall_linux.go | 33 +- .../x/sys/unix/zsyscall_openbsd_386.go | 24 + .../x/sys/unix/zsyscall_openbsd_386.s | 5 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 24 + .../x/sys/unix/zsyscall_openbsd_amd64.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm.go | 24 + .../x/sys/unix/zsyscall_openbsd_arm.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 24 + .../x/sys/unix/zsyscall_openbsd_arm64.s | 5 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 24 + .../x/sys/unix/zsyscall_openbsd_mips64.s | 5 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 24 + .../x/sys/unix/zsyscall_openbsd_ppc64.s | 6 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 24 + .../x/sys/unix/zsyscall_openbsd_riscv64.s | 5 + .../x/sys/unix/zsysnum_linux_386.go | 1 + .../x/sys/unix/zsysnum_linux_amd64.go | 2 + .../x/sys/unix/zsysnum_linux_arm.go | 1 + .../x/sys/unix/zsysnum_linux_arm64.go | 3 +- .../x/sys/unix/zsysnum_linux_loong64.go | 3 + .../x/sys/unix/zsysnum_linux_mips.go | 1 + .../x/sys/unix/zsysnum_linux_mips64.go | 1 + .../x/sys/unix/zsysnum_linux_mips64le.go | 1 + .../x/sys/unix/zsysnum_linux_mipsle.go | 1 + .../x/sys/unix/zsysnum_linux_ppc.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64.go | 1 + .../x/sys/unix/zsysnum_linux_ppc64le.go | 1 + .../x/sys/unix/zsysnum_linux_riscv64.go | 3 +- .../x/sys/unix/zsysnum_linux_s390x.go | 1 + .../x/sys/unix/zsysnum_linux_sparc64.go | 1 + .../x/sys/unix/ztypes_darwin_amd64.go | 13 + .../x/sys/unix/ztypes_darwin_arm64.go | 13 + .../x/sys/unix/ztypes_freebsd_386.go | 1 + .../x/sys/unix/ztypes_freebsd_amd64.go | 1 + .../x/sys/unix/ztypes_freebsd_arm.go | 1 + .../x/sys/unix/ztypes_freebsd_arm64.go | 1 + .../x/sys/unix/ztypes_freebsd_riscv64.go | 1 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 96 +- .../x/sys/unix/ztypes_linux_riscv64.go | 33 + .../golang.org/x/sys/windows/dll_windows.go | 2 +- .../x/sys/windows/security_windows.go | 2 +- .../x/sys/windows/svc/mgr/config.go | 2 +- .../x/sys/windows/svc/mgr/recovery.go | 4 +- .../x/sys/windows/syscall_windows.go | 16 +- .../golang.org/x/sys/windows/types_windows.go | 72 +- .../x/sys/windows/zsyscall_windows.go | 87 +- vendor/golang.org/x/term/LICENSE | 4 +- vendor/golang.org/x/term/term_windows.go | 1 + vendor/golang.org/x/text/LICENSE | 4 +- vendor/modules.txt | 16 +- 195 files changed, 25816 insertions(+), 5880 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/conn_iter.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/conn_old.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_other.go rename vendor/github.com/ncruces/go-sqlite3/internal/{util/alloc.go => alloc/alloc_unix.go} (78%) create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go delete mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/math.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/set.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/registry.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm create mode 100644 vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go rename vendor/github.com/ncruces/go-sqlite3/vfs/{os_std_access.go => os_std.go} (73%) delete mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_std_mode.go delete mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go delete mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go create mode 100644 vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go create mode 100644 vendor/golang.org/x/sys/unix/vgetrandom_linux.go create mode 100644 vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go diff --git a/go.mod b/go.mod index 0fb1cb2b3b..a41bde568e 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/miekg/dns v1.1.59 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e - github.com/ncruces/go-sqlite3 v0.15.0 + github.com/ncruces/go-sqlite3 v0.20.2 github.com/reeflective/console v0.1.15 github.com/reeflective/readline v1.0.14 github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 @@ -42,17 +42,17 @@ require ( github.com/spf13/cobra v1.8.1 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.9.0 - github.com/tetratelabs/wazero v1.8.0 + github.com/tetratelabs/wazero v1.8.1 github.com/things-go/go-socks5 v0.0.5 github.com/ulikunitz/xz v0.5.12 github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.1 - golang.org/x/crypto v0.25.0 + golang.org/x/crypto v0.28.0 golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f golang.org/x/net v0.26.0 - golang.org/x/sys v0.22.0 - golang.org/x/term v0.22.0 - golang.org/x/text v0.16.0 + golang.org/x/sys v0.26.0 + golang.org/x/term v0.25.0 + golang.org/x/text v0.19.0 golang.zx2c4.com/wireguard v0.0.0-20231211153847-12269c276173 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20230429144221-925a1e7659e6 google.golang.org/grpc v1.64.1 @@ -175,7 +175,7 @@ require ( go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20231129151722-fdeea329fbba // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/sync v0.7.0 // indirect + golang.org/x/sync v0.8.0 // indirect golang.org/x/time v0.5.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect diff --git a/go.sum b/go.sum index 1bb9176ade..b20adb2ede 100644 --- a/go.sum +++ b/go.sum @@ -303,8 +303,8 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e h1:IkFCPlAa0iTiLxck+NqAwBx8JDlnHYm4orOQBbs4BDQ= github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e/go.mod h1:eYeI6cQ5YHhHt9i0BBW0zc1DaQnb4ZMXsSPuEV/V5Og= -github.com/ncruces/go-sqlite3 v0.15.0 h1:C+SIrcYsAIR5GUYWmCnif6x81n6BS9y75vYcQynuGNU= -github.com/ncruces/go-sqlite3 v0.15.0/go.mod h1:kHHYmFmK4G2VFFoIovEg9BEQ8BP+D81y4ESHXnzJV/w= +github.com/ncruces/go-sqlite3 v0.20.2 h1:cMLIwrLZQuCWVCEOowSqlIlpzgbag3jnYVW4NM5u01M= +github.com/ncruces/go-sqlite3 v0.20.2/go.mod h1:yL4ZNWGsr1/8pcLfpPW1RT1WFdvyeHonrgIwwi4rvkg= github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4= github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls= github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= @@ -387,8 +387,8 @@ github.com/tc-hib/winres v0.2.1 h1:YDE0FiP0VmtRaDn7+aaChp1KiF4owBiJa5l964l5ujA= github.com/tc-hib/winres v0.2.1/go.mod h1:C/JaNhH3KBvhNKVbvdlDWkbMDO9H4fKKDaN7/07SSuk= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= -github.com/tetratelabs/wazero v1.8.0 h1:iEKu0d4c2Pd+QSRieYbnQC9yiFlMS9D+Jr0LsRmcF4g= -github.com/tetratelabs/wazero v1.8.0/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= +github.com/tetratelabs/wazero v1.8.1 h1:NrcgVbWfkWvVc4UtT4LRLDf91PsOzDzefMdwhLfA550= +github.com/tetratelabs/wazero v1.8.1/go.mod h1:yAI0XTsMBhREkM/YDAK/zNou3GoiAce1P6+rp/wQhjs= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= github.com/things-go/go-socks5 v0.0.5 h1:qvKaGcBkfDrUL33SchHN93srAmYGzb4CxSM2DPYufe8= @@ -427,8 +427,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.25.0 h1:ypSNr+bnYL2YhwoMt2zPxHFmbAN1KZs/njMG3hxUp30= -golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= @@ -467,8 +467,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= +golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -498,18 +498,18 @@ golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= -golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.22.0 h1:BbsgPEJULsl2fV/AT3v15Mjva5yXKQDyKf+TbDz7QJk= -golang.org/x/term v0.22.0/go.mod h1:F3qCibpT5AMpCRfhfT53vVJwhLtIVHhB9XDjfFvnMI4= +golang.org/x/term v0.25.0 h1:WtHI/ltw4NvSUig5KARz9h521QvRC8RmF/cuYqifU24= +golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 3cf5b4afe0..935b9f254f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -1,4 +1,4 @@ -# Go bindings to SQLite using Wazero +# Go bindings to SQLite using wazero [![Go Reference](https://pkg.go.dev/badge/image)](https://pkg.go.dev/github.com/ncruces/go-sqlite3) [![Go Report](https://goreportcard.com/badge/github.com/ncruces/go-sqlite3)](https://goreportcard.com/report/github.com/ncruces/go-sqlite3) @@ -10,7 +10,21 @@ as well as direct access to most of the [C SQLite API](https://sqlite.org/cintro It wraps a [Wasm](https://webassembly.org/) [build](embed/) of SQLite, and uses [wazero](https://wazero.io/) as the runtime.\ -Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ runtime dependencies [^1]. +Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ runtime dependencies. + +### Getting started + +Using the [`database/sql`](https://pkg.go.dev/database/sql) driver: +```go + +import "database/sql" +import _ "github.com/ncruces/go-sqlite3/driver" +import _ "github.com/ncruces/go-sqlite3/embed" + +var version string +db, _ := sql.Open("sqlite3", "file:demo.db") +db.QueryRow(`SELECT sqlite_version()`).Scan(&version) +``` ### Packages @@ -27,37 +41,6 @@ Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ run - [`github.com/ncruces/go-sqlite3/gormlite`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/gormlite) provides a [GORM](https://gorm.io) driver. -### Extensions - -- [`github.com/ncruces/go-sqlite3/ext/array`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/array) - provides the [`array`](https://sqlite.org/carray.html) table-valued function. -- [`github.com/ncruces/go-sqlite3/ext/blobio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/blobio) - simplifies [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html). -- [`github.com/ncruces/go-sqlite3/ext/csv`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/csv) - reads [comma-separated values](https://sqlite.org/csv.html). -- [`github.com/ncruces/go-sqlite3/ext/fileio`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/fileio) - reads, writes and lists files. -- [`github.com/ncruces/go-sqlite3/ext/hash`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/hash) - provides cryptographic hash functions. -- [`github.com/ncruces/go-sqlite3/ext/lines`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/lines) - reads data [line-by-line](https://github.com/asg017/sqlite-lines). -- [`github.com/ncruces/go-sqlite3/ext/pivot`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/pivot) - creates [pivot tables](https://github.com/jakethaw/pivot_vtab). -- [`github.com/ncruces/go-sqlite3/ext/statement`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/statement) - creates [parameterized views](https://github.com/0x09/sqlite-statement-vtab). -- [`github.com/ncruces/go-sqlite3/ext/stats`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/stats) - provides [statistics](https://www.oreilly.com/library/view/sql-in-a/9780596155322/ch04s02.html) functions. -- [`github.com/ncruces/go-sqlite3/ext/unicode`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/unicode) - provides [Unicode aware](https://sqlite.org/src/dir/ext/icu) functions. -- [`github.com/ncruces/go-sqlite3/ext/zorder`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/zorder) - maps multidimensional data to one dimension. -- [`github.com/ncruces/go-sqlite3/vfs/memdb`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb) - implements an in-memory VFS. -- [`github.com/ncruces/go-sqlite3/vfs/readervfs`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs) - implements a VFS for immutable databases. -- [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) - wraps a VFS to offer encryption at rest. - ### Advanced features - [incremental BLOB I/O](https://sqlite.org/c3ref/blob_open.html) @@ -70,7 +53,11 @@ Go, wazero and [`x/sys`](https://pkg.go.dev/golang.org/x/sys) are the _only_ run - [math functions](https://sqlite.org/lang_mathfunc.html) - [full-text search](https://sqlite.org/fts5.html) - [geospatial search](https://sqlite.org/geopoly.html) +- [Unicode support](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/unicode) +- [statistics functions](https://pkg.go.dev/github.com/ncruces/go-sqlite3/ext/stats) - [encryption at rest](vfs/adiantum/README.md) +- [many extensions](ext/README.md) +- [custom VFSes](vfs/README.md#custom-vfses) - [and more…](embed/README.md) ### Caveats @@ -87,8 +74,11 @@ This project aims for [high test coverage](https://github.com/ncruces/go-sqlite3 It also benefits greatly from [SQLite's](https://sqlite.org/testing.html) and [wazero's](https://tetrate.io/blog/introducing-wazero-from-tetrate/#:~:text=Rock%2Dsolid%20test%20approach) thorough testing. -Every commit is [tested](.github/workflows/test.yml) on -Linux (amd64/arm64/386/riscv64), macOS (amd64/arm64), Windows, FreeBSD and illumos. +Every commit is [tested](https://github.com/ncruces/go-sqlite3/wiki/Test-matrix) on +Linux (amd64/arm64/386/riscv64/ppc64le/s390x), macOS (amd64/arm64), +Windows (amd64), FreeBSD (amd64), OpenBSD (amd64), NetBSD (amd64), +illumos (amd64), and Solaris (amd64). + The Go VFS is tested by running SQLite's [mptest](https://github.com/sqlite/sqlite/blob/master/mptest/mptest.c). @@ -105,7 +95,4 @@ The Wasm and VFS layers are also tested by running SQLite's - [`modernc.org/sqlite`](https://pkg.go.dev/modernc.org/sqlite) - [`crawshaw.io/sqlite`](https://pkg.go.dev/crawshaw.io/sqlite) - [`github.com/mattn/go-sqlite3`](https://pkg.go.dev/github.com/mattn/go-sqlite3) -- [`github.com/zombiezen/go-sqlite`](https://pkg.go.dev/github.com/zombiezen/go-sqlite) - -[^1]: anything else you find in `go.mod` is either a test dependency, - or needed by one of the extensions. +- [`github.com/zombiezen/go-sqlite`](https://pkg.go.dev/github.com/zombiezen/go-sqlite) \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/blob.go b/vendor/github.com/ncruces/go-sqlite3/blob.go index bb10c5fa2e..a0969eb697 100644 --- a/vendor/github.com/ncruces/go-sqlite3/blob.go +++ b/vendor/github.com/ncruces/go-sqlite3/blob.go @@ -21,6 +21,8 @@ type Blob struct { bytes int64 offset int64 handle uint32 + bufptr uint32 + buflen int64 } var _ io.ReadWriteSeeker = &Blob{} @@ -29,7 +31,6 @@ var _ io.ReadWriteSeeker = &Blob{} // // https://sqlite.org/c3ref/blob_open.html func (c *Conn) OpenBlob(db, table, column string, row int64, write bool) (*Blob, error) { - c.checkInterrupt() defer c.arena.mark()() blobPtr := c.arena.new(ptrlen) dbPtr := c.arena.string(db) @@ -41,6 +42,7 @@ func (c *Conn) OpenBlob(db, table, column string, row int64, write bool) (*Blob, flags = 1 } + c.checkInterrupt(c.handle) r := c.call("sqlite3_blob_open", uint64(c.handle), uint64(dbPtr), uint64(tablePtr), uint64(columnPtr), uint64(row), flags, uint64(blobPtr)) @@ -66,7 +68,7 @@ func (b *Blob) Close() error { } r := b.c.call("sqlite3_blob_close", uint64(b.handle)) - + b.c.free(b.bufptr) b.handle = 0 return b.c.error(r) } @@ -86,17 +88,18 @@ func (b *Blob) Read(p []byte) (n int, err error) { return 0, io.EOF } - avail := b.bytes - b.offset want := int64(len(p)) + avail := b.bytes - b.offset if want > avail { want = avail } - - defer b.c.arena.mark()() - ptr := b.c.arena.new(uint64(want)) + if want > b.buflen { + b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.buflen = want + } r := b.c.call("sqlite3_blob_read", uint64(b.handle), - uint64(ptr), uint64(want), uint64(b.offset)) + uint64(b.bufptr), uint64(want), uint64(b.offset)) err = b.c.error(r) if err != nil { return 0, err @@ -106,7 +109,7 @@ func (b *Blob) Read(p []byte) (n int, err error) { err = io.EOF } - copy(p, util.View(b.c.mod, ptr, uint64(want))) + copy(p, util.View(b.c.mod, b.bufptr, uint64(want))) return int(want), err } @@ -123,19 +126,20 @@ func (b *Blob) WriteTo(w io.Writer) (n int64, err error) { if want > avail { want = avail } - - defer b.c.arena.mark()() - ptr := b.c.arena.new(uint64(want)) + if want > b.buflen { + b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.buflen = want + } for want > 0 { r := b.c.call("sqlite3_blob_read", uint64(b.handle), - uint64(ptr), uint64(want), uint64(b.offset)) + uint64(b.bufptr), uint64(want), uint64(b.offset)) err = b.c.error(r) if err != nil { return n, err } - mem := util.View(b.c.mod, ptr, uint64(want)) + mem := util.View(b.c.mod, b.bufptr, uint64(want)) m, err := w.Write(mem[:want]) b.offset += int64(m) n += int64(m) @@ -143,6 +147,7 @@ func (b *Blob) WriteTo(w io.Writer) (n int64, err error) { return n, err } if int64(m) != want { + // notest // Write misbehaving return n, io.ErrShortWrite } @@ -158,11 +163,15 @@ func (b *Blob) WriteTo(w io.Writer) (n int64, err error) { // // https://sqlite.org/c3ref/blob_write.html func (b *Blob) Write(p []byte) (n int, err error) { - defer b.c.arena.mark()() - ptr := b.c.arena.bytes(p) + want := int64(len(p)) + if want > b.buflen { + b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.buflen = want + } + util.WriteBytes(b.c.mod, b.bufptr, p) r := b.c.call("sqlite3_blob_write", uint64(b.handle), - uint64(ptr), uint64(len(p)), uint64(b.offset)) + uint64(b.bufptr), uint64(want), uint64(b.offset)) err = b.c.error(r) if err != nil { return 0, err @@ -186,16 +195,17 @@ func (b *Blob) ReadFrom(r io.Reader) (n int64, err error) { if want < 1 { want = 1 } - - defer b.c.arena.mark()() - ptr := b.c.arena.new(uint64(want)) + if want > b.buflen { + b.bufptr = b.c.realloc(b.bufptr, uint64(want)) + b.buflen = want + } for { - mem := util.View(b.c.mod, ptr, uint64(want)) + mem := util.View(b.c.mod, b.bufptr, uint64(want)) m, err := r.Read(mem[:want]) if m > 0 { r := b.c.call("sqlite3_blob_write", uint64(b.handle), - uint64(ptr), uint64(m), uint64(b.offset)) + uint64(b.bufptr), uint64(m), uint64(b.offset)) err := b.c.error(r) if err != nil { return n, err @@ -243,6 +253,7 @@ func (b *Blob) Seek(offset int64, whence int) (int64, error) { // // https://sqlite.org/c3ref/blob_reopen.html func (b *Blob) Reopen(row int64) error { + b.c.checkInterrupt(b.c.handle) err := b.c.error(b.c.call("sqlite3_blob_reopen", uint64(b.handle), uint64(row))) b.bytes = int64(b.c.call("sqlite3_blob_bytes", uint64(b.handle))) b.offset = 0 diff --git a/vendor/github.com/ncruces/go-sqlite3/config.go b/vendor/github.com/ncruces/go-sqlite3/config.go index 0342be7fb3..474f960a24 100644 --- a/vendor/github.com/ncruces/go-sqlite3/config.go +++ b/vendor/github.com/ncruces/go-sqlite3/config.go @@ -2,9 +2,13 @@ package sqlite3 import ( "context" + "fmt" + "strconv" - "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/ncruces/go-sqlite3/vfs" ) // Config makes configuration changes to a database connection. @@ -14,8 +18,19 @@ import ( // // https://sqlite.org/c3ref/db_config.html func (c *Conn) Config(op DBConfig, arg ...bool) (bool, error) { + if op < DBCONFIG_ENABLE_FKEY || op > DBCONFIG_REVERSE_SCANORDER { + return false, MISUSE + } + + // We need to call sqlite3_db_config, a variadic function. + // We only support the `int int*` variants. + // The int is a three-valued bool: -1 queries, 0/1 sets false/true. + // The int* points to where new state will be written to. + // The vararg is a pointer to an array containing these arguments: + // an int and an int* pointing to that int. + defer c.arena.mark()() - argsPtr := c.arena.new(2 * ptrlen) + argsPtr := c.arena.new(intlen + ptrlen) var flag int switch { @@ -56,6 +71,112 @@ func logCallback(ctx context.Context, mod api.Module, _, iCode, zMsg uint32) { } } +// Log writes a message into the error log established by [Conn.ConfigLog]. +// +// https://sqlite.org/c3ref/log.html +func (c *Conn) Log(code ExtendedErrorCode, format string, a ...any) { + if c.log != nil { + c.log(code, fmt.Sprintf(format, a...)) + } +} + +// FileControl allows low-level control of database files. +// Only a subset of opcodes are supported. +// +// https://sqlite.org/c3ref/file_control.html +func (c *Conn) FileControl(schema string, op FcntlOpcode, arg ...any) (any, error) { + defer c.arena.mark()() + ptr := c.arena.new(max(ptrlen, intlen)) + + var schemaPtr uint32 + if schema != "" { + schemaPtr = c.arena.string(schema) + } + + var rc uint64 + var res any + switch op { + default: + return nil, MISUSE + + case FCNTL_RESET_CACHE: + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), 0) + + case FCNTL_PERSIST_WAL, FCNTL_POWERSAFE_OVERWRITE: + var flag int + switch { + case len(arg) == 0: + flag = -1 + case arg[0]: + flag = 1 + } + util.WriteUint32(c.mod, ptr, uint32(flag)) + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + res = util.ReadUint32(c.mod, ptr) != 0 + + case FCNTL_CHUNK_SIZE: + util.WriteUint32(c.mod, ptr, uint32(arg[0].(int))) + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + + case FCNTL_RESERVE_BYTES: + bytes := -1 + if len(arg) > 0 { + bytes = arg[0].(int) + } + util.WriteUint32(c.mod, ptr, uint32(bytes)) + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + res = int(util.ReadUint32(c.mod, ptr)) + + case FCNTL_DATA_VERSION: + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + res = util.ReadUint32(c.mod, ptr) + + case FCNTL_LOCKSTATE: + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + res = vfs.LockLevel(util.ReadUint32(c.mod, ptr)) + + case FCNTL_VFS_POINTER: + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + if rc == _OK { + const zNameOffset = 16 + ptr = util.ReadUint32(c.mod, ptr) + ptr = util.ReadUint32(c.mod, ptr+zNameOffset) + name := util.ReadString(c.mod, ptr, _MAX_NAME) + res = vfs.Find(name) + } + + case FCNTL_FILE_POINTER, FCNTL_JOURNAL_POINTER: + rc = c.call("sqlite3_file_control", + uint64(c.handle), uint64(schemaPtr), + uint64(op), uint64(ptr)) + if rc == _OK { + const fileHandleOffset = 4 + ptr = util.ReadUint32(c.mod, ptr) + ptr = util.ReadUint32(c.mod, ptr+fileHandleOffset) + res = util.GetHandle(c.ctx, ptr) + } + } + + if err := c.error(rc); err != nil { + return nil, err + } + return res, nil +} + // Limit allows the size of various constructs to be // limited on a connection by connection basis. // @@ -68,7 +189,7 @@ func (c *Conn) Limit(id LimitCategory, value int) int { // SetAuthorizer registers an authorizer callback with the database connection. // // https://sqlite.org/c3ref/set_authorizer.html -func (c *Conn) SetAuthorizer(cb func(action AuthorizerActionCode, name3rd, name4th, schema, nameInner string) AuthorizerReturnCode) error { +func (c *Conn) SetAuthorizer(cb func(action AuthorizerActionCode, name3rd, name4th, schema, inner string) AuthorizerReturnCode) error { var enable uint64 if cb != nil { enable = 1 @@ -82,9 +203,9 @@ func (c *Conn) SetAuthorizer(cb func(action AuthorizerActionCode, name3rd, name4 } -func authorizerCallback(ctx context.Context, mod api.Module, pDB uint32, action AuthorizerActionCode, zName3rd, zName4th, zSchema, zNameInner uint32) (rc AuthorizerReturnCode) { +func authorizerCallback(ctx context.Context, mod api.Module, pDB uint32, action AuthorizerActionCode, zName3rd, zName4th, zSchema, zInner uint32) (rc AuthorizerReturnCode) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.authorizer != nil { - var name3rd, name4th, schema, nameInner string + var name3rd, name4th, schema, inner string if zName3rd != 0 { name3rd = util.ReadString(mod, zName3rd, _MAX_NAME) } @@ -94,18 +215,56 @@ func authorizerCallback(ctx context.Context, mod api.Module, pDB uint32, action if zSchema != 0 { schema = util.ReadString(mod, zSchema, _MAX_NAME) } - if zNameInner != 0 { - nameInner = util.ReadString(mod, zNameInner, _MAX_NAME) + if zInner != 0 { + inner = util.ReadString(mod, zInner, _MAX_NAME) + } + rc = c.authorizer(action, name3rd, name4th, schema, inner) + } + return rc +} + +// Trace registers a trace callback function against the database connection. +// +// https://sqlite.org/c3ref/trace_v2.html +func (c *Conn) Trace(mask TraceEvent, cb func(evt TraceEvent, arg1 any, arg2 any) error) error { + r := c.call("sqlite3_trace_go", uint64(c.handle), uint64(mask)) + if err := c.error(r); err != nil { + return err + } + c.trace = cb + return nil +} + +func traceCallback(ctx context.Context, mod api.Module, evt TraceEvent, pDB, pArg1, pArg2 uint32) (rc uint32) { + if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.trace != nil { + var arg1, arg2 any + if evt == TRACE_CLOSE { + arg1 = c + } else { + for _, s := range c.stmts { + if pArg1 == s.handle { + arg1 = s + switch evt { + case TRACE_STMT: + arg2 = s.SQL() + case TRACE_PROFILE: + arg2 = int64(util.ReadUint64(mod, pArg2)) + } + break + } + } + } + if arg1 != nil { + _, rc = errorCode(c.trace(evt, arg1, arg2), ERROR) } - rc = c.authorizer(action, name3rd, name4th, schema, nameInner) } return rc } -// WalCheckpoint checkpoints a WAL database. +// WALCheckpoint checkpoints a WAL database. // // https://sqlite.org/c3ref/wal_checkpoint_v2.html -func (c *Conn) WalCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt int, err error) { +func (c *Conn) WALCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt int, err error) { defer c.arena.mark()() nLogPtr := c.arena.new(ptrlen) nCkptPtr := c.arena.new(ptrlen) @@ -118,19 +277,19 @@ func (c *Conn) WalCheckpoint(schema string, mode CheckpointMode) (nLog, nCkpt in return nLog, nCkpt, c.error(r) } -// WalAutoCheckpoint configures WAL auto-checkpoints. +// WALAutoCheckpoint configures WAL auto-checkpoints. // // https://sqlite.org/c3ref/wal_autocheckpoint.html -func (c *Conn) WalAutoCheckpoint(pages int) error { +func (c *Conn) WALAutoCheckpoint(pages int) error { r := c.call("sqlite3_wal_autocheckpoint", uint64(c.handle), uint64(pages)) return c.error(r) } -// WalHook registers a callback function to be invoked +// WALHook registers a callback function to be invoked // each time data is committed to a database in WAL mode. // // https://sqlite.org/c3ref/wal_hook.html -func (c *Conn) WalHook(cb func(db *Conn, schema string, pages int) error) { +func (c *Conn) WALHook(cb func(db *Conn, schema string, pages int) error) { var enable uint64 if cb != nil { enable = 1 @@ -152,7 +311,10 @@ func walCallback(ctx context.Context, mod api.Module, _, pDB, zSchema uint32, pa // // https://sqlite.org/c3ref/autovacuum_pages.html func (c *Conn) AutoVacuumPages(cb func(schema string, dbPages, freePages, bytesPerPage uint) uint) error { - funcPtr := util.AddHandle(c.ctx, cb) + var funcPtr uint32 + if cb != nil { + funcPtr = util.AddHandle(c.ctx, cb) + } r := c.call("sqlite3_autovacuum_pages_go", uint64(c.handle), uint64(funcPtr)) return c.error(r) } @@ -162,3 +324,60 @@ func autoVacuumCallback(ctx context.Context, mod api.Module, pApp, zSchema, nDbP schema := util.ReadString(mod, zSchema, _MAX_NAME) return uint32(fn(schema, uint(nDbPage), uint(nFreePage), uint(nBytePerPage))) } + +// SoftHeapLimit imposes a soft limit on heap size. +// +// https://sqlite.org/c3ref/hard_heap_limit64.html +func (c *Conn) SoftHeapLimit(n int64) int64 { + return int64(c.call("sqlite3_soft_heap_limit64", uint64(n))) +} + +// HardHeapLimit imposes a hard limit on heap size. +// +// https://sqlite.org/c3ref/hard_heap_limit64.html +func (c *Conn) HardHeapLimit(n int64) int64 { + return int64(c.call("sqlite3_hard_heap_limit64", uint64(n))) +} + +// EnableChecksums enables checksums on a database. +// +// https://sqlite.org/cksumvfs.html +func (c *Conn) EnableChecksums(schema string) error { + r, err := c.FileControl(schema, FCNTL_RESERVE_BYTES) + if err != nil { + return err + } + if r == 8 { + // Correct value, enabled. + return nil + } + if r == 0 { + // Default value, enable. + _, err = c.FileControl(schema, FCNTL_RESERVE_BYTES, 8) + if err != nil { + return err + } + r, err = c.FileControl(schema, FCNTL_RESERVE_BYTES) + if err != nil { + return err + } + } + if r != 8 { + // Invalid value. + return util.ErrorString("sqlite3: reserve bytes must be 8, is: " + strconv.Itoa(r.(int))) + } + + // VACUUM the database. + if schema != "" { + err = c.Exec(`VACUUM ` + QuoteIdentifier(schema)) + } else { + err = c.Exec(`VACUUM`) + } + if err != nil { + return err + } + + // Checkpoint the WAL. + _, _, err = c.WALCheckpoint(schema, CHECKPOINT_RESTART) + return err +} diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index 8ba034feef..3ba4375b4a 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -8,9 +8,10 @@ import ( "strings" "time" + "github.com/tetratelabs/wazero/api" + "github.com/ncruces/go-sqlite3/internal/util" "github.com/ncruces/go-sqlite3/vfs" - "github.com/tetratelabs/wazero/api" ) // Conn is a database connection handle. @@ -22,27 +23,36 @@ type Conn struct { interrupt context.Context pending *Stmt - busy func(int) bool + stmts []*Stmt + timer *time.Timer + busy func(context.Context, int) bool log func(xErrorCode, string) collation func(*Conn, string) + wal func(*Conn, string, int) error + trace func(TraceEvent, any, any) error authorizer func(AuthorizerActionCode, string, string, string, string) AuthorizerReturnCode update func(AuthorizerActionCode, string, string, int64) commit func() bool rollback func() - wal func(*Conn, string, int) error arena arena handle uint32 } -// Open calls [OpenFlags] with [OPEN_READWRITE], [OPEN_CREATE], [OPEN_URI] and [OPEN_NOFOLLOW]. +// Open calls [OpenFlags] with [OPEN_READWRITE], [OPEN_CREATE] and [OPEN_URI]. func Open(filename string) (*Conn, error) { - return newConn(filename, OPEN_READWRITE|OPEN_CREATE|OPEN_URI|OPEN_NOFOLLOW) + return newConn(context.Background(), filename, OPEN_READWRITE|OPEN_CREATE|OPEN_URI) +} + +// OpenContext is like [Open] but includes a context, +// which is used to interrupt the process of opening the connectiton. +func OpenContext(ctx context.Context, filename string) (*Conn, error) { + return newConn(ctx, filename, OPEN_READWRITE|OPEN_CREATE|OPEN_URI) } // OpenFlags opens an SQLite database file as specified by the filename argument. // -// If none of the required flags is used, a combination of [OPEN_READWRITE] and [OPEN_CREATE] is used. +// If none of the required flags are used, a combination of [OPEN_READWRITE] and [OPEN_CREATE] is used. // If a URI filename is used, PRAGMA statements to execute can be specified using "_pragma": // // sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)") @@ -52,26 +62,37 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { if flags&(OPEN_READONLY|OPEN_READWRITE|OPEN_CREATE) == 0 { flags |= OPEN_READWRITE | OPEN_CREATE } - return newConn(filename, flags) + return newConn(context.Background(), filename, flags) } type connKey struct{} -func newConn(filename string, flags OpenFlag) (conn *Conn, err error) { - sqlite, err := instantiateSQLite() +func newConn(ctx context.Context, filename string, flags OpenFlag) (res *Conn, _ error) { + err := ctx.Err() + if err != nil { + return nil, err + } + + c := &Conn{interrupt: ctx} + c.sqlite, err = instantiateSQLite() if err != nil { return nil, err } defer func() { - if conn == nil { - sqlite.close() + if res == nil { + c.Close() + c.sqlite.close() + } else { + c.interrupt = context.Background() } }() - c := &Conn{sqlite: sqlite} - c.arena = c.newArena(1024) c.ctx = context.WithValue(c.ctx, connKey{}, c) + c.arena = c.newArena(1024) c.handle, err = c.openDB(filename, flags) + if err == nil { + err = initExtensions(c) + } if err != nil { return nil, err } @@ -92,6 +113,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { return 0, err } + c.call("sqlite3_progress_handler_go", uint64(handle), 100) if flags|OPEN_URI != 0 && strings.HasPrefix(filename, "file:") { var pragmas strings.Builder if _, after, ok := strings.Cut(filename, "?"); ok { @@ -103,6 +125,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { } } if pragmas.Len() != 0 { + c.checkInterrupt(handle) pragmaPtr := c.arena.string(pragmas.String()) r := c.call("sqlite3_exec", uint64(handle), uint64(pragmaPtr), 0, 0, 0) if err := c.sqlite.error(r, handle, pragmas.String()); err != nil { @@ -112,7 +135,6 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { } } } - c.call("sqlite3_progress_handler_go", uint64(handle), 100) return handle, nil } @@ -154,10 +176,10 @@ func (c *Conn) Close() error { // // https://sqlite.org/c3ref/exec.html func (c *Conn) Exec(sql string) error { - c.checkInterrupt() defer c.arena.mark()() sqlPtr := c.arena.string(sql) + c.checkInterrupt(c.handle) r := c.call("sqlite3_exec", uint64(c.handle), uint64(sqlPtr), 0, 0, 0) return c.error(r, sql) } @@ -183,6 +205,7 @@ func (c *Conn) PrepareFlags(sql string, flags PrepareFlag) (stmt *Stmt, tail str tailPtr := c.arena.new(ptrlen) sqlPtr := c.arena.string(sql) + c.checkInterrupt(c.handle) r := c.call("sqlite3_prepare_v3", uint64(c.handle), uint64(sqlPtr), uint64(len(sql)+1), uint64(flags), uint64(stmtPtr), uint64(tailPtr)) @@ -199,6 +222,7 @@ func (c *Conn) PrepareFlags(sql string, flags PrepareFlag) (stmt *Stmt, tail str if stmt.handle == 0 { return nil, "", nil } + c.stmts = append(c.stmts, stmt) return stmt, tail, nil } @@ -224,9 +248,8 @@ func (c *Conn) Filename(schema string) *vfs.Filename { defer c.arena.mark()() ptr = c.arena.string(schema) } - r := c.call("sqlite3_db_filename", uint64(c.handle), uint64(ptr)) - return vfs.OpenFilename(c.ctx, c.mod, uint32(r), vfs.OPEN_MAIN_DB) + return vfs.GetFilename(c.ctx, c.mod, uint32(r), vfs.OPEN_MAIN_DB) } // ReadOnly determines if a database is read-only. @@ -295,8 +318,7 @@ func (c *Conn) ReleaseMemory() error { return c.error(r) } -// GetInterrupt gets the context set with [Conn.SetInterrupt], -// or nil if none was set. +// GetInterrupt gets the context set with [Conn.SetInterrupt]. func (c *Conn) GetInterrupt() context.Context { return c.interrupt } @@ -316,40 +338,43 @@ func (c *Conn) GetInterrupt() context.Context { // // https://sqlite.org/c3ref/interrupt.html func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { - // Is it the same context? - if ctx == c.interrupt { - return ctx + old = c.interrupt + c.interrupt = ctx + + if ctx == old || ctx.Done() == old.Done() { + return old } // A busy SQL statement prevents SQLite from ignoring an interrupt // that comes before any other statements are started. if c.pending == nil { - c.pending, _, _ = c.Prepare(`WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x FROM c) SELECT x FROM c`) + defer c.arena.mark()() + stmtPtr := c.arena.new(ptrlen) + loopPtr := c.arena.string(`WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x FROM c) SELECT x FROM c`) + c.call("sqlite3_prepare_v3", uint64(c.handle), uint64(loopPtr), math.MaxUint64, + uint64(PREPARE_PERSISTENT), uint64(stmtPtr), 0) + c.pending = &Stmt{c: c} + c.pending.handle = util.ReadUint32(c.mod, stmtPtr) } - old = c.interrupt - c.interrupt = ctx - - if old != nil && old.Done() != nil && (ctx == nil || ctx.Err() == nil) { + if old.Done() != nil && ctx.Err() == nil { c.pending.Reset() } - if ctx != nil && ctx.Done() != nil { + if ctx.Done() != nil { c.pending.Step() } return old } -func (c *Conn) checkInterrupt() { - if c.interrupt != nil && c.interrupt.Err() != nil { - c.call("sqlite3_interrupt", uint64(c.handle)) +func (c *Conn) checkInterrupt(handle uint32) { + if c.interrupt.Err() != nil { + c.call("sqlite3_interrupt", uint64(handle)) } } -func progressCallback(ctx context.Context, mod api.Module, pDB uint32) (interrupt uint32) { - if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.interrupt != nil { - if c.interrupt.Err() != nil { - interrupt = 1 - } +func progressCallback(ctx context.Context, mod api.Module, _ uint32) (interrupt uint32) { + if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.interrupt.Err() != nil { + interrupt = 1 } return interrupt } @@ -363,10 +388,47 @@ func (c *Conn) BusyTimeout(timeout time.Duration) error { return c.error(r) } +func timeoutCallback(ctx context.Context, mod api.Module, count, tmout int32) (retry uint32) { + if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.interrupt.Err() == nil { + const delays = "\x01\x02\x05\x0a\x0f\x14\x19\x19\x19\x32\x32\x64" + const totals = "\x00\x01\x03\x08\x12\x21\x35\x4e\x67\x80\xb2\xe4" + const ndelay = int32(len(delays) - 1) + + var delay, prior int32 + if count <= ndelay { + delay = int32(delays[count]) + prior = int32(totals[count]) + } else { + delay = int32(delays[ndelay]) + prior = int32(totals[ndelay]) + delay*(count-ndelay) + } + + if delay = min(delay, tmout-prior); delay > 0 { + delay := time.Duration(delay) * time.Millisecond + if c.interrupt.Done() == nil { + time.Sleep(delay) + return 1 + } + if c.timer == nil { + c.timer = time.NewTimer(delay) + } else { + c.timer.Reset(delay) + } + select { + case <-c.interrupt.Done(): + c.timer.Stop() + case <-c.timer.C: + return 1 + } + } + } + return 0 +} + // BusyHandler registers a callback to handle [BUSY] errors. // // https://sqlite.org/c3ref/busy_handler.html -func (c *Conn) BusyHandler(cb func(count int) (retry bool)) error { +func (c *Conn) BusyHandler(cb func(ctx context.Context, count int) (retry bool)) error { var enable uint64 if cb != nil { enable = 1 @@ -381,22 +443,81 @@ func (c *Conn) BusyHandler(cb func(count int) (retry bool)) error { func busyCallback(ctx context.Context, mod api.Module, pDB uint32, count int32) (retry uint32) { if c, ok := ctx.Value(connKey{}).(*Conn); ok && c.handle == pDB && c.busy != nil { - if c.busy(int(count)) { + interrupt := c.interrupt + if interrupt == nil { + interrupt = context.Background() + } + if interrupt.Err() == nil && c.busy(interrupt, int(count)) { retry = 1 } } return retry } +// Status retrieves runtime status information about a database connection. +// +// https://sqlite.org/c3ref/db_status.html +func (c *Conn) Status(op DBStatus, reset bool) (current, highwater int, err error) { + defer c.arena.mark()() + hiPtr := c.arena.new(intlen) + curPtr := c.arena.new(intlen) + + var i uint64 + if reset { + i = 1 + } + + r := c.call("sqlite3_db_status", uint64(c.handle), + uint64(op), uint64(curPtr), uint64(hiPtr), i) + if err = c.error(r); err == nil { + current = int(util.ReadUint32(c.mod, curPtr)) + highwater = int(util.ReadUint32(c.mod, hiPtr)) + } + return +} + +// TableColumnMetadata extracts metadata about a column of a table. +// +// https://sqlite.org/c3ref/table_column_metadata.html +func (c *Conn) TableColumnMetadata(schema, table, column string) (declType, collSeq string, notNull, primaryKey, autoInc bool, err error) { + defer c.arena.mark()() + + var schemaPtr, columnPtr uint32 + declTypePtr := c.arena.new(ptrlen) + collSeqPtr := c.arena.new(ptrlen) + notNullPtr := c.arena.new(ptrlen) + autoIncPtr := c.arena.new(ptrlen) + primaryKeyPtr := c.arena.new(ptrlen) + if schema != "" { + schemaPtr = c.arena.string(schema) + } + tablePtr := c.arena.string(table) + if column != "" { + columnPtr = c.arena.string(column) + } + + r := c.call("sqlite3_table_column_metadata", uint64(c.handle), + uint64(schemaPtr), uint64(tablePtr), uint64(columnPtr), + uint64(declTypePtr), uint64(collSeqPtr), + uint64(notNullPtr), uint64(primaryKeyPtr), uint64(autoIncPtr)) + if err = c.error(r); err == nil && column != "" { + declType = util.ReadString(c.mod, util.ReadUint32(c.mod, declTypePtr), _MAX_NAME) + collSeq = util.ReadString(c.mod, util.ReadUint32(c.mod, collSeqPtr), _MAX_NAME) + notNull = util.ReadUint32(c.mod, notNullPtr) != 0 + autoInc = util.ReadUint32(c.mod, autoIncPtr) != 0 + primaryKey = util.ReadUint32(c.mod, primaryKeyPtr) != 0 + } + return +} + func (c *Conn) error(rc uint64, sql ...string) error { return c.sqlite.error(rc, c.handle, sql...) } -// DriverConn is implemented by the SQLite [database/sql] driver connection. -// -// It can be used to access SQLite features like [online backup]. -// -// [online backup]: https://sqlite.org/backup.html -type DriverConn interface { - Raw() *Conn +func (c *Conn) stmtsIter(yield func(*Stmt) bool) { + for _, s := range c.stmts { + if !yield(s) { + break + } + } } diff --git a/vendor/github.com/ncruces/go-sqlite3/conn_iter.go b/vendor/github.com/ncruces/go-sqlite3/conn_iter.go new file mode 100644 index 0000000000..470f0ade23 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/conn_iter.go @@ -0,0 +1,11 @@ +//go:build go1.23 + +package sqlite3 + +import "iter" + +// Stmts returns an iterator for the prepared statements +// associated with the database connection. +// +// https://sqlite.org/c3ref/next_stmt.html +func (c *Conn) Stmts() iter.Seq[*Stmt] { return c.stmtsIter } diff --git a/vendor/github.com/ncruces/go-sqlite3/conn_old.go b/vendor/github.com/ncruces/go-sqlite3/conn_old.go new file mode 100644 index 0000000000..4663fa04d0 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/conn_old.go @@ -0,0 +1,9 @@ +//go:build !go1.23 + +package sqlite3 + +// Stmts returns an iterator for the prepared statements +// associated with the database connection. +// +// https://sqlite.org/c3ref/next_stmt.html +func (c *Conn) Stmts() func(func(*Stmt) bool) { return c.stmtsIter } diff --git a/vendor/github.com/ncruces/go-sqlite3/const.go b/vendor/github.com/ncruces/go-sqlite3/const.go index 2bb53656f4..3a6a8cdb9f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/const.go @@ -7,15 +7,13 @@ const ( _ROW = 100 /* sqlite3_step() has another row ready */ _DONE = 101 /* sqlite3_step() has finished executing */ - _UTF8 = 1 - - _MAX_NAME = 1e6 // Self-imposed limit for most NUL terminated strings. - _MAX_LENGTH = 1e9 - _MAX_SQL_LENGTH = 1e9 - _MAX_ALLOCATION_SIZE = 0x7ffffeff - _MAX_FUNCTION_ARG = 100 + _MAX_NAME = 1e6 // Self-imposed limit for most NUL terminated strings. + _MAX_LENGTH = 1e9 + _MAX_SQL_LENGTH = 1e9 + _MAX_FUNCTION_ARG = 100 ptrlen = 4 + intlen = 4 ) // ErrorCode is a result code that [Error.Code] might return. @@ -109,7 +107,7 @@ const ( CANTOPEN_ISDIR ExtendedErrorCode = xErrorCode(CANTOPEN) | (2 << 8) CANTOPEN_FULLPATH ExtendedErrorCode = xErrorCode(CANTOPEN) | (3 << 8) CANTOPEN_CONVPATH ExtendedErrorCode = xErrorCode(CANTOPEN) | (4 << 8) - CANTOPEN_DIRTYWAL ExtendedErrorCode = xErrorCode(CANTOPEN) | (5 << 8) /* Not Used */ + // CANTOPEN_DIRTYWAL ExtendedErrorCode = xErrorCode(CANTOPEN) | (5 << 8) /* Not Used */ CANTOPEN_SYMLINK ExtendedErrorCode = xErrorCode(CANTOPEN) | (6 << 8) CORRUPT_VTAB ExtendedErrorCode = xErrorCode(CORRUPT) | (1 << 8) CORRUPT_SEQUENCE ExtendedErrorCode = xErrorCode(CORRUPT) | (2 << 8) @@ -177,11 +175,12 @@ const ( type FunctionFlag uint32 const ( - DETERMINISTIC FunctionFlag = 0x000000800 - DIRECTONLY FunctionFlag = 0x000080000 - SUBTYPE FunctionFlag = 0x000100000 - INNOCUOUS FunctionFlag = 0x000200000 - RESULT_SUBTYPE FunctionFlag = 0x001000000 + DETERMINISTIC FunctionFlag = 0x000000800 + DIRECTONLY FunctionFlag = 0x000080000 + INNOCUOUS FunctionFlag = 0x000200000 + SELFORDER1 FunctionFlag = 0x002000000 + // SUBTYPE FunctionFlag = 0x000100000 + // RESULT_SUBTYPE FunctionFlag = 0x001000000 ) // StmtStatus name counter values associated with the [Stmt.Status] method. @@ -201,6 +200,27 @@ const ( STMTSTATUS_MEMUSED StmtStatus = 99 ) +// DBStatus are the available "verbs" that can be passed to the [Conn.Status] method. +// +// https://sqlite.org/c3ref/c_dbstatus_options.html +type DBStatus uint32 + +const ( + DBSTATUS_LOOKASIDE_USED DBStatus = 0 + DBSTATUS_CACHE_USED DBStatus = 1 + DBSTATUS_SCHEMA_USED DBStatus = 2 + DBSTATUS_STMT_USED DBStatus = 3 + DBSTATUS_LOOKASIDE_HIT DBStatus = 4 + DBSTATUS_LOOKASIDE_MISS_SIZE DBStatus = 5 + DBSTATUS_LOOKASIDE_MISS_FULL DBStatus = 6 + DBSTATUS_CACHE_HIT DBStatus = 7 + DBSTATUS_CACHE_MISS DBStatus = 8 + DBSTATUS_CACHE_WRITE DBStatus = 9 + DBSTATUS_DEFERRED_FKS DBStatus = 10 + DBSTATUS_CACHE_USED_SHARED DBStatus = 11 + DBSTATUS_CACHE_SPILL DBStatus = 12 +) + // DBConfig are the available database connection configuration options. // // https://sqlite.org/c3ref/c_dbconfig_defensive.html @@ -227,6 +247,25 @@ const ( DBCONFIG_TRUSTED_SCHEMA DBConfig = 1017 DBCONFIG_STMT_SCANSTATUS DBConfig = 1018 DBCONFIG_REVERSE_SCANORDER DBConfig = 1019 + // DBCONFIG_MAX DBConfig = 1019 +) + +// FcntlOpcode are the available opcodes for [Conn.FileControl]. +// +// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html +type FcntlOpcode uint32 + +const ( + FCNTL_LOCKSTATE FcntlOpcode = 1 + FCNTL_CHUNK_SIZE FcntlOpcode = 6 + FCNTL_FILE_POINTER FcntlOpcode = 7 + FCNTL_PERSIST_WAL FcntlOpcode = 10 + FCNTL_POWERSAFE_OVERWRITE FcntlOpcode = 13 + FCNTL_VFS_POINTER FcntlOpcode = 27 + FCNTL_JOURNAL_POINTER FcntlOpcode = 28 + FCNTL_DATA_VERSION FcntlOpcode = 35 + FCNTL_RESERVE_BYTES FcntlOpcode = 38 + FCNTL_RESET_CACHE FcntlOpcode = 42 ) // LimitCategory are the available run-time limit categories. @@ -289,8 +328,8 @@ const ( AUTH_DROP_VTABLE AuthorizerActionCode = 30 /* Table Name Module Name */ AUTH_FUNCTION AuthorizerActionCode = 31 /* NULL Function Name */ AUTH_SAVEPOINT AuthorizerActionCode = 32 /* Operation Savepoint Name */ - AUTH_COPY AuthorizerActionCode = 0 /* No longer used */ AUTH_RECURSIVE AuthorizerActionCode = 33 /* NULL NULL */ + // AUTH_COPY AuthorizerActionCode = 0 /* No longer used */ ) // AuthorizerReturnCode are the integer codes @@ -328,6 +367,18 @@ const ( TXN_WRITE TxnState = 2 ) +// TraceEvent identify classes of events that can be monitored with [Conn.Trace]. +// +// https://sqlite.org/c3ref/c_trace.html +type TraceEvent uint32 + +const ( + TRACE_STMT TraceEvent = 0x01 + TRACE_PROFILE TraceEvent = 0x02 + TRACE_ROW TraceEvent = 0x04 + TRACE_CLOSE TraceEvent = 0x08 +) + // Datatype is a fundamental datatype of SQLite. // // https://sqlite.org/c3ref/c_blob.html diff --git a/vendor/github.com/ncruces/go-sqlite3/context.go b/vendor/github.com/ncruces/go-sqlite3/context.go index 8d7604c660..86be214e24 100644 --- a/vendor/github.com/ncruces/go-sqlite3/context.go +++ b/vendor/github.com/ncruces/go-sqlite3/context.go @@ -84,19 +84,18 @@ func (ctx Context) ResultFloat(value float64) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultText(value string) { ptr := ctx.c.newString(value) - ctx.c.call("sqlite3_result_text64", - uint64(ctx.handle), uint64(ptr), uint64(len(value)), - uint64(ctx.c.freer), _UTF8) + ctx.c.call("sqlite3_result_text_go", + uint64(ctx.handle), uint64(ptr), uint64(len(value))) } // ResultRawText sets the text result of the function to a []byte. +// Returning a nil slice is the same as calling [Context.ResultNull]. // // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultRawText(value []byte) { ptr := ctx.c.newBytes(value) - ctx.c.call("sqlite3_result_text64", - uint64(ctx.handle), uint64(ptr), uint64(len(value)), - uint64(ctx.c.freer), _UTF8) + ctx.c.call("sqlite3_result_text_go", + uint64(ctx.handle), uint64(ptr), uint64(len(value))) } // ResultBlob sets the result of the function to a []byte. @@ -105,9 +104,8 @@ func (ctx Context) ResultRawText(value []byte) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultBlob(value []byte) { ptr := ctx.c.newBytes(value) - ctx.c.call("sqlite3_result_blob64", - uint64(ctx.handle), uint64(ptr), uint64(len(value)), - uint64(ctx.c.freer)) + ctx.c.call("sqlite3_result_blob_go", + uint64(ctx.handle), uint64(ptr), uint64(len(value))) } // ResultZeroBlob sets the result of the function to a zero-filled, length n BLOB. @@ -130,7 +128,8 @@ func (ctx Context) ResultNull() { // // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultTime(value time.Time, format TimeFormat) { - if format == TimeFormatDefault { + switch format { + case TimeFormatDefault, TimeFormatAuto, time.RFC3339Nano: ctx.resultRFC3339Nano(value) return } @@ -153,9 +152,8 @@ func (ctx Context) resultRFC3339Nano(value time.Time) { buf := util.View(ctx.c.mod, ptr, maxlen) buf = value.AppendFormat(buf[:0], time.RFC3339Nano) - ctx.c.call("sqlite3_result_text64", - uint64(ctx.handle), uint64(ptr), uint64(len(buf)), - uint64(ctx.c.freer), _UTF8) + ctx.c.call("sqlite3_result_text_go", + uint64(ctx.handle), uint64(ptr), uint64(len(buf))) } // ResultPointer sets the result of the function to NULL, just like [Context.ResultNull], @@ -165,7 +163,8 @@ func (ctx Context) resultRFC3339Nano(value time.Time) { // https://sqlite.org/c3ref/result_blob.html func (ctx Context) ResultPointer(ptr any) { valPtr := util.AddHandle(ctx.c.ctx, ptr) - ctx.c.call("sqlite3_result_pointer_go", uint64(valPtr)) + ctx.c.call("sqlite3_result_pointer_go", + uint64(ctx.handle), uint64(valPtr)) } // ResultJSON sets the result of the function to the JSON encoding of value. @@ -175,7 +174,7 @@ func (ctx Context) ResultJSON(value any) { data, err := json.Marshal(value) if err != nil { ctx.ResultError(err) - return + return // notest } ctx.ResultRawText(data) } diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index b496f76ec6..88c4c50db6 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -8,21 +8,50 @@ // // The data source name for "sqlite3" databases can be a filename or a "file:" [URI]. // +// # Default transaction mode +// // The [TRANSACTION] mode can be specified using "_txlock": // // sql.Open("sqlite3", "file:demo.db?_txlock=immediate") // -// Possible values are: "deferred", "immediate", "exclusive". -// A [read-only] transaction is always "deferred", regardless of "_txlock". +// Possible values are: "deferred" (the default), "immediate", "exclusive". +// Regardless of "_txlock": +// - a [linearizable] transaction is always "exclusive"; +// - a [serializable] transaction is always "immediate"; +// - a [read-only] transaction is always "deferred". +// +// # Working with time // // The time encoding/decoding format can be specified using "_timefmt": // // sql.Open("sqlite3", "file:demo.db?_timefmt=sqlite") // // Possible values are: "auto" (the default), "sqlite", "rfc3339"; -// "auto" encodes as RFC 3339 and decodes any [format] supported by SQLite; -// "sqlite" encodes as SQLite and decodes any [format] supported by SQLite; -// "rfc3339" encodes and decodes RFC 3339 only. +// - "auto" encodes as RFC 3339 and decodes any [format] supported by SQLite; +// - "sqlite" encodes as SQLite and decodes any [format] supported by SQLite; +// - "rfc3339" encodes and decodes RFC 3339 only. +// +// If you encode as RFC 3339 (the default), +// consider using the TIME [collating sequence] to produce a time-ordered sequence. +// +// To scan values in other formats, [sqlite3.TimeFormat.Scanner] may be helpful. +// To bind values in other formats, [sqlite3.TimeFormat.Encode] them before binding. +// +// When using a custom time struct, you'll have to implement +// [database/sql/driver.Valuer] and [database/sql.Scanner]. +// +// The Value method should ideally encode to a time [format] supported by SQLite. +// This ensures SQL date and time functions work as they should, +// and that your schema works with other SQLite tools. +// [sqlite3.TimeFormat.Encode] may help. +// +// The Scan method needs to take into account that the value it receives can be of differing types. +// It can already be a [time.Time], if the driver decoded the value according to "_timefmt" rules. +// Or it can be a: string, int64, float64, []byte, or nil, +// depending on the column type and what whoever wrote the value. +// [sqlite3.TimeFormat.Decode] may help. +// +// # Setting PRAGMAs // // [PRAGMA] statements can be specified using "_pragma": // @@ -31,13 +60,17 @@ // If no PRAGMAs are specified, a busy timeout of 1 minute is set. // // Order matters: -// busy timeout and locking mode should be the first PRAGMAs set, in that order. +// encryption keys, busy timeout and locking mode should be the first PRAGMAs set, +// in that order. // // [URI]: https://sqlite.org/uri.html // [PRAGMA]: https://sqlite.org/pragma.html -// [format]: https://sqlite.org/lang_datefunc.html#time_values // [TRANSACTION]: https://sqlite.org/lang_transaction.html#deferred_immediate_and_exclusive_transactions +// [linearizable]: https://pkg.go.dev/database/sql#TxOptions +// [serializable]: https://pkg.go.dev/database/sql#TxOptions // [read-only]: https://pkg.go.dev/database/sql#TxOptions +// [format]: https://sqlite.org/lang_datefunc.html#time_values +// [collating sequence]: https://sqlite.org/datatype3.html#collating_sequences package driver import ( @@ -69,11 +102,22 @@ func init() { // Open opens the SQLite database specified by dataSourceName as a [database/sql.DB]. // -// The init function is called by the driver on new connections. +// Open accepts zero, one, or two callbacks (nil callbacks are ignored). +// The first callback is called when the driver opens a new connection. +// The second callback is called before the driver closes a connection. // The [sqlite3.Conn] can be used to execute queries, register functions, etc. -// Any error returned closes the connection and is returned to [database/sql]. -func Open(dataSourceName string, init func(*sqlite3.Conn) error) (*sql.DB, error) { - c, err := (&SQLite{Init: init}).OpenConnector(dataSourceName) +func Open(dataSourceName string, fn ...func(*sqlite3.Conn) error) (*sql.DB, error) { + var drv SQLite + if len(fn) > 2 { + return nil, sqlite3.MISUSE + } + if len(fn) > 1 { + drv.term = fn[1] + } + if len(fn) > 0 { + drv.init = fn[0] + } + c, err := drv.OpenConnector(dataSourceName) if err != nil { return nil, err } @@ -82,12 +126,15 @@ func Open(dataSourceName string, init func(*sqlite3.Conn) error) (*sql.DB, error // SQLite implements [database/sql/driver.Driver]. type SQLite struct { - // Init function is called by the driver on new connections. - // The [sqlite3.Conn] can be used to execute queries, register functions, etc. - // Any error returned closes the connection and is returned to [database/sql]. - Init func(*sqlite3.Conn) error + init func(*sqlite3.Conn) error + term func(*sqlite3.Conn) error } +var ( + // Ensure these interfaces are implemented: + _ driver.DriverContext = &SQLite{} +) + // Open implements [database/sql/driver.Driver]. func (d *SQLite) Open(name string) (driver.Conn, error) { c, err := d.newConnector(name) @@ -119,10 +166,8 @@ func (d *SQLite) newConnector(name string) (*connector, error) { } switch txlock { - case "": - c.txBegin = "BEGIN" - case "deferred", "immediate", "exclusive": - c.txBegin = "BEGIN " + txlock + case "", "deferred", "concurrent", "immediate", "exclusive": + c.txLock = txlock default: return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", txlock) } @@ -147,7 +192,7 @@ func (d *SQLite) newConnector(name string) (*connector, error) { type connector struct { driver *SQLite name string - txBegin string + txLock string tmRead sqlite3.TimeFormat tmWrite sqlite3.TimeFormat pragmas bool @@ -157,19 +202,19 @@ func (n *connector) Driver() driver.Driver { return n.driver } -func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) { +func (n *connector) Connect(ctx context.Context) (res driver.Conn, err error) { c := &conn{ - txBegin: n.txBegin, + txLock: n.txLock, tmRead: n.tmRead, tmWrite: n.tmWrite, } - c.Conn, err = sqlite3.Open(n.name) + c.Conn, err = sqlite3.OpenContext(ctx, n.name) if err != nil { return nil, err } defer func() { - if err != nil { + if res == nil { c.Close() } }() @@ -178,22 +223,23 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) { defer c.Conn.SetInterrupt(old) if !n.pragmas { - err = c.Conn.BusyTimeout(60 * time.Second) + err = c.Conn.BusyTimeout(time.Minute) if err != nil { return nil, err } } - if n.driver.Init != nil { - err = n.driver.Init(c.Conn) + if n.driver.init != nil { + err = n.driver.init(c.Conn) if err != nil { return nil, err } } - if n.pragmas || n.driver.Init != nil { + if n.pragmas || n.driver.init != nil { s, _, err := c.Conn.Prepare(`PRAGMA query_only`) if err != nil { return nil, err } + defer s.Close() if s.Step() && s.ColumnBool(0) { c.readOnly = '1' } else { @@ -204,57 +250,93 @@ func (n *connector) Connect(ctx context.Context) (_ driver.Conn, err error) { return nil, err } } + if n.driver.term != nil { + err = c.Conn.Trace(sqlite3.TRACE_CLOSE, func(sqlite3.TraceEvent, any, any) error { + return n.driver.term(c.Conn) + }) + if err != nil { + return nil, err + } + } return c, nil } +// Conn is implemented by the SQLite [database/sql] driver connections. +// +// It can be used to access SQLite features like [online backup]: +// +// db, err := driver.Open("temp.db") +// if err != nil { +// log.Fatal(err) +// } +// defer db.Close() +// +// conn, err := db.Conn(context.TODO()) +// if err != nil { +// log.Fatal(err) +// } +// +// err = conn.Raw(func(driverConn any) error { +// conn := driverConn.(driver.Conn) +// return conn.Raw().Backup("main", "backup.db") +// }) +// if err != nil { +// log.Fatal(err) +// } +// +// [online backup]: https://sqlite.org/backup.html +type Conn interface { + Raw() *sqlite3.Conn + driver.Conn +} + type conn struct { *sqlite3.Conn - txBegin string - txCommit string - txRollback string - tmRead sqlite3.TimeFormat - tmWrite sqlite3.TimeFormat - readOnly byte + txLock string + txReset string + tmRead sqlite3.TimeFormat + tmWrite sqlite3.TimeFormat + readOnly byte } var ( // Ensure these interfaces are implemented: + _ Conn = &conn{} + _ driver.ConnBeginTx = &conn{} _ driver.ConnPrepareContext = &conn{} _ driver.ExecerContext = &conn{} - _ driver.ConnBeginTx = &conn{} - _ sqlite3.DriverConn = &conn{} ) func (c *conn) Raw() *sqlite3.Conn { return c.Conn } +// Deprecated: use BeginTx instead. func (c *conn) Begin() (driver.Tx, error) { + // notest return c.BeginTx(context.Background(), driver.TxOptions{}) } func (c *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, error) { - txBegin := c.txBegin - c.txCommit = `COMMIT` - c.txRollback = `ROLLBACK` - - if opts.ReadOnly { - txBegin = ` - BEGIN deferred; - PRAGMA query_only=on` - c.txRollback = ` - ROLLBACK; - PRAGMA query_only=` + string(c.readOnly) - c.txCommit = c.txRollback - } - + var txLock string switch opts.Isolation { default: return nil, util.IsolationErr - case - driver.IsolationLevel(sql.LevelDefault), - driver.IsolationLevel(sql.LevelSerializable): - break + case driver.IsolationLevel(sql.LevelLinearizable): + txLock = "exclusive" + case driver.IsolationLevel(sql.LevelSerializable): + txLock = "immediate" + case driver.IsolationLevel(sql.LevelDefault): + if !opts.ReadOnly { + txLock = c.txLock + } + } + + c.txReset = `` + txBegin := `BEGIN ` + txLock + if opts.ReadOnly { + txBegin += ` ; PRAGMA query_only=on` + c.txReset = `; PRAGMA query_only=` + string(c.readOnly) } old := c.Conn.SetInterrupt(ctx) @@ -268,7 +350,7 @@ func (c *conn) BeginTx(ctx context.Context, opts driver.TxOptions) (driver.Tx, e } func (c *conn) Commit() error { - err := c.Conn.Exec(c.txCommit) + err := c.Conn.Exec(`COMMIT` + c.txReset) if err != nil && !c.Conn.GetAutocommit() { c.Rollback() } @@ -276,16 +358,17 @@ func (c *conn) Commit() error { } func (c *conn) Rollback() error { - err := c.Conn.Exec(c.txRollback) + err := c.Conn.Exec(`ROLLBACK` + c.txReset) if errors.Is(err, sqlite3.INTERRUPT) { old := c.Conn.SetInterrupt(context.Background()) defer c.Conn.SetInterrupt(old) - err = c.Conn.Exec(c.txRollback) + err = c.Conn.Exec(`ROLLBACK` + c.txReset) } return err } func (c *conn) Prepare(query string) (driver.Stmt, error) { + // notest return c.PrepareContext(context.Background(), query) } @@ -301,7 +384,7 @@ func (c *conn) PrepareContext(ctx context.Context, query string) (driver.Stmt, e s.Close() return nil, util.TailErr } - return &stmt{Stmt: s, tmRead: c.tmRead, tmWrite: c.tmWrite}, nil + return &stmt{Stmt: s, tmRead: c.tmRead, tmWrite: c.tmWrite, inputs: -2}, nil } func (c *conn) ExecContext(ctx context.Context, query string, args []driver.NamedValue) (driver.Result, error) { @@ -328,6 +411,8 @@ func (c *conn) ExecContext(ctx context.Context, query string, args []driver.Name } func (c *conn) CheckNamedValue(arg *driver.NamedValue) error { + // Fast path: short circuit argument verification. + // Arguments will be rejected by conn.ExecContext. return nil } @@ -335,6 +420,7 @@ type stmt struct { *sqlite3.Stmt tmWrite sqlite3.TimeFormat tmRead sqlite3.TimeFormat + inputs int } var ( @@ -345,22 +431,29 @@ var ( ) func (s *stmt) NumInput() int { + if s.inputs >= -1 { + return s.inputs + } n := s.Stmt.BindCount() for i := 1; i <= n; i++ { if s.Stmt.BindName(i) != "" { + s.inputs = -1 return -1 } } + s.inputs = n return n } // Deprecated: use ExecContext instead. func (s *stmt) Exec(args []driver.Value) (driver.Result, error) { + // notest return s.ExecContext(context.Background(), namedValues(args)) } // Deprecated: use QueryContext instead. func (s *stmt) Query(args []driver.Value) (driver.Rows, error) { + // notest return s.QueryContext(context.Background(), namedValues(args)) } @@ -374,6 +467,7 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive defer s.Stmt.Conn().SetInterrupt(old) err = s.Stmt.Exec() + s.Stmt.ClearBindings() if err != nil { return nil, err } @@ -389,19 +483,14 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv return &rows{ctx: ctx, stmt: s}, nil } -func (s *stmt) setupBindings(args []driver.NamedValue) error { - err := s.Stmt.ClearBindings() - if err != nil { - return err - } - +func (s *stmt) setupBindings(args []driver.NamedValue) (err error) { var ids [3]int for _, arg := range args { ids := ids[:0] if arg.Name == "" { ids = append(ids, arg.Ordinal) } else { - for _, prefix := range []string{":", "@", "$"} { + for _, prefix := range [...]string{":", "@", "$"} { if id := s.Stmt.BindIndex(prefix + arg.Name); id != 0 { ids = append(ids, id) } @@ -435,9 +524,9 @@ func (s *stmt) setupBindings(args []driver.NamedValue) error { default: panic(util.AssertErr()) } - } - if err != nil { - return err + if err != nil { + return err + } } } return nil @@ -491,8 +580,15 @@ type rows struct { *stmt names []string types []string + nulls []bool } +var ( + // Ensure these interfaces are implemented: + _ driver.RowsColumnTypeDatabaseTypeName = &rows{} + _ driver.RowsColumnTypeNullable = &rows{} +) + func (r *rows) Close() error { r.Stmt.ClearBindings() return r.Stmt.Reset() @@ -501,27 +597,48 @@ func (r *rows) Close() error { func (r *rows) Columns() []string { if r.names == nil { count := r.Stmt.ColumnCount() - r.names = make([]string, count) - for i := range r.names { - r.names[i] = r.Stmt.ColumnName(i) + names := make([]string, count) + for i := range names { + names[i] = r.Stmt.ColumnName(i) } + r.names = names } return r.names } +func (r *rows) loadTypes() { + if r.nulls == nil { + count := r.Stmt.ColumnCount() + nulls := make([]bool, count) + types := make([]string, count) + for i := range nulls { + if col := r.Stmt.ColumnOriginName(i); col != "" { + types[i], _, nulls[i], _, _, _ = r.Stmt.Conn().TableColumnMetadata( + r.Stmt.ColumnDatabaseName(i), + r.Stmt.ColumnTableName(i), + col) + } + } + r.nulls = nulls + r.types = types + } +} + func (r *rows) declType(index int) string { if r.types == nil { count := r.Stmt.ColumnCount() - r.types = make([]string, count) - for i := range r.types { - r.types[i] = strings.ToUpper(r.Stmt.ColumnDeclType(i)) + types := make([]string, count) + for i := range types { + types[i] = strings.ToUpper(r.Stmt.ColumnDeclType(i)) } + r.types = types } return r.types[index] } func (r *rows) ColumnTypeDatabaseTypeName(index int) string { - decltype := r.declType(index) + r.loadTypes() + decltype := r.types[index] if len := len(decltype); len > 0 && decltype[len-1] == ')' { if i := strings.LastIndexByte(decltype, '('); i >= 0 { decltype = decltype[:i] @@ -530,6 +647,14 @@ func (r *rows) ColumnTypeDatabaseTypeName(index int) string { return strings.TrimSpace(decltype) } +func (r *rows) ColumnTypeNullable(index int) (nullable, ok bool) { + r.loadTypes() + if r.nulls[index] { + return false, true + } + return true, false +} + func (r *rows) Next(dest []driver.Value) error { old := r.Stmt.Conn().SetInterrupt(r.ctx) defer r.Stmt.Conn().SetInterrupt(old) @@ -546,31 +671,29 @@ func (r *rows) Next(dest []driver.Value) error { for i := range dest { if t, ok := r.decodeTime(i, dest[i]); ok { dest[i] = t - continue - } - if s, ok := dest[i].(string); ok { - t, ok := maybeTime(s) - if ok { - dest[i] = t - } } } return err } -func (r *rows) decodeTime(i int, v any) (_ time.Time, _ bool) { - if r.tmRead == sqlite3.TimeFormatDefault { +func (r *rows) decodeTime(i int, v any) (_ time.Time, ok bool) { + switch v := v.(type) { + case int64, float64: + // could be a time value + case string: + if r.tmWrite != "" && r.tmWrite != time.RFC3339 && r.tmWrite != time.RFC3339Nano { + break + } + t, ok := maybeTime(v) + if ok { + return t, true + } + default: return } switch r.declType(i) { case "DATE", "TIME", "DATETIME", "TIMESTAMP": - // maybe - default: - return - } - switch v.(type) { - case int64, float64, string: - // maybe + // could be a time value default: return } diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/savepoint.go b/vendor/github.com/ncruces/go-sqlite3/driver/savepoint.go index 60aa6b9914..eea40dd683 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/savepoint.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/savepoint.go @@ -16,12 +16,25 @@ func Savepoint(tx *sql.Tx) sqlite3.Savepoint { return ctx.Savepoint } +// A saveptCtx is never canceled, has no values, and has no deadline. type saveptCtx struct{ sqlite3.Savepoint } -func (*saveptCtx) Deadline() (deadline time.Time, ok bool) { return } +func (*saveptCtx) Deadline() (deadline time.Time, ok bool) { + // notest + return +} -func (*saveptCtx) Done() <-chan struct{} { return nil } +func (*saveptCtx) Done() <-chan struct{} { + // notest + return nil +} -func (*saveptCtx) Err() error { return nil } +func (*saveptCtx) Err() error { + // notest + return nil +} -func (*saveptCtx) Value(key any) any { return nil } +func (*saveptCtx) Value(key any) any { + // notest + return nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index 87281a83f8..b7b25c4613 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -1,6 +1,6 @@ # Embeddable Wasm build of SQLite -This folder includes an embeddable Wasm build of SQLite 3.45.3 for use with +This folder includes an embeddable Wasm build of SQLite 3.47.0 for use with [`github.com/ncruces/go-sqlite3`](https://pkg.go.dev/github.com/ncruces/go-sqlite3). The following optional features are compiled in: @@ -9,18 +9,33 @@ The following optional features are compiled in: - [JSON](https://sqlite.org/json1.html) - [R*Tree](https://sqlite.org/rtree.html) - [GeoPoly](https://sqlite.org/geopoly.html) +- [Spellfix1](https://sqlite.org/spellfix1.html) - [soundex](https://sqlite.org/lang_corefunc.html#soundex) +- [stat4](https://sqlite.org/compile.html#enable_stat4) - [base64](https://github.com/sqlite/sqlite/blob/master/ext/misc/base64.c) - [decimal](https://github.com/sqlite/sqlite/blob/master/ext/misc/decimal.c) - [ieee754](https://github.com/sqlite/sqlite/blob/master/ext/misc/ieee754.c) - [regexp](https://github.com/sqlite/sqlite/blob/master/ext/misc/regexp.c) - [series](https://github.com/sqlite/sqlite/blob/master/ext/misc/series.c) - [uint](https://github.com/sqlite/sqlite/blob/master/ext/misc/uint.c) -- [uuid](https://github.com/sqlite/sqlite/blob/master/ext/misc/uuid.c) - [time](../sqlite3/time.c) -See the [configuration options](../sqlite3/sqlite_cfg.h), +See the [configuration options](../sqlite3/sqlite_opt.h), and [patches](../sqlite3) applied. Built using [`wasi-sdk`](https://github.com/WebAssembly/wasi-sdk), -and [`binaryen`](https://github.com/WebAssembly/binaryen). \ No newline at end of file +and [`binaryen`](https://github.com/WebAssembly/binaryen). + +The build is easily reproducible, and verifiable, using +[Artifact Attestations](https://github.com/ncruces/go-sqlite3/attestations). + +### Customizing the build + +You can use your own custom build of SQLite. + +Examples of custom builds of SQLite are: +- [`github.com/ncruces/go-sqlite3/embed/bcw2`](https://github.com/ncruces/go-sqlite3/tree/main/embed/bcw2) + built from a branch supporting [`BEGIN CONCURRENT`](https://sqlite.org/src/doc/begin-concurrent/doc/begin_concurrent.md) + and [Wal2](https://sqlite.org/cgi/src/doc/wal2/doc/wal2.md). +- [`github.com/asg017/sqlite-vec-go-bindings/ncruces`](https://github.com/asg017/sqlite-vec-go-bindings) + which includes the [`sqlite-vec`](https://github.com/asg017/sqlite-vec) vector search extension. \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index c50112c0bf..ed2aaec530 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -4,25 +4,27 @@ set -euo pipefail cd -P -- "$(dirname -- "$0")" ROOT=../ -BINARYEN="$ROOT/tools/binaryen-version_117/bin" -WASI_SDK="$ROOT/tools/wasi-sdk-22.0/bin" +BINARYEN="$ROOT/tools/binaryen/bin" +WASI_SDK="$ROOT/tools/wasi-sdk/bin" -"$WASI_SDK/clang" --target=wasm32-wasi -std=c17 -flto -g0 -O2 \ - -Wall -Wextra -Wno-unused-parameter \ +trap 'rm -f sqlite3.tmp' EXIT + +"$WASI_SDK/clang" --target=wasm32-wasi -std=c23 -g0 -O2 \ + -Wall -Wextra -Wno-unused-parameter -Wno-unused-function \ -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ - -msimd128 -mmutable-globals \ + -matomics -msimd128 -mmutable-globals -mmultivalue \ -mbulk-memory -mreference-types \ -mnontrapping-fptoint -msign-ext \ -fno-stack-protector -fno-stack-clash-protection \ - -Wl,--initial-memory=327680 \ -Wl,--stack-first \ -Wl,--import-undefined \ + -Wl,--initial-memory=327680 \ -D_HAVE_SQLITE_CONFIG_H \ + -DSQLITE_CUSTOM_INCLUDE=sqlite_opt.h \ $(awk '{print "-Wl,--export="$0}' exports.txt) -trap 'rm -f sqlite3.tmp' EXIT "$BINARYEN/wasm-ctor-eval" -g -c _initialize sqlite3.wasm -o sqlite3.tmp "$BINARYEN/wasm-opt" -g --strip --strip-producers -c -O3 \ sqlite3.tmp -o sqlite3.wasm \ diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt index da16316bbe..546019552e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt +++ b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt @@ -1,7 +1,4 @@ aligned_alloc -free -malloc -malloc_destructor sqlite3_anycollseq_init sqlite3_autovacuum_pages_go sqlite3_backup_finish @@ -9,7 +6,7 @@ sqlite3_backup_init sqlite3_backup_pagecount sqlite3_backup_remaining sqlite3_backup_step -sqlite3_bind_blob64 +sqlite3_bind_blob_go sqlite3_bind_double sqlite3_bind_int64 sqlite3_bind_null @@ -17,7 +14,7 @@ sqlite3_bind_parameter_count sqlite3_bind_parameter_index sqlite3_bind_parameter_name sqlite3_bind_pointer_go -sqlite3_bind_text64 +sqlite3_bind_text_go sqlite3_bind_value sqlite3_bind_zeroblob64 sqlite3_blob_bytes @@ -36,10 +33,13 @@ sqlite3_collation_needed_go sqlite3_column_blob sqlite3_column_bytes sqlite3_column_count +sqlite3_column_database_name sqlite3_column_decltype sqlite3_column_double sqlite3_column_int64 sqlite3_column_name +sqlite3_column_origin_name +sqlite3_column_table_name sqlite3_column_text sqlite3_column_type sqlite3_column_value @@ -51,33 +51,42 @@ sqlite3_create_collation_go sqlite3_create_function_go sqlite3_create_module_go sqlite3_create_window_function_go +sqlite3_data_count sqlite3_database_file_object +sqlite3_db_cacheflush sqlite3_db_config sqlite3_db_filename sqlite3_db_name sqlite3_db_readonly sqlite3_db_release_memory +sqlite3_db_status sqlite3_declare_vtab sqlite3_errcode sqlite3_errmsg sqlite3_error_offset sqlite3_errstr sqlite3_exec +sqlite3_expanded_sql +sqlite3_file_control sqlite3_filename_database sqlite3_filename_journal sqlite3_filename_wal sqlite3_finalize +sqlite3_free sqlite3_get_autocommit sqlite3_get_auxdata +sqlite3_hard_heap_limit64 sqlite3_interrupt sqlite3_last_insert_rowid sqlite3_limit +sqlite3_malloc64 sqlite3_open_v2 sqlite3_overload_function sqlite3_prepare_v3 sqlite3_progress_handler_go +sqlite3_realloc64 sqlite3_reset -sqlite3_result_blob64 +sqlite3_result_blob_go sqlite3_result_double sqlite3_result_error sqlite3_result_error_code @@ -86,27 +95,30 @@ sqlite3_result_error_toobig sqlite3_result_int64 sqlite3_result_null sqlite3_result_pointer_go -sqlite3_result_text64 +sqlite3_result_text_go sqlite3_result_value sqlite3_result_zeroblob64 sqlite3_rollback_hook_go sqlite3_set_authorizer_go sqlite3_set_auxdata_go sqlite3_set_last_insert_rowid +sqlite3_soft_heap_limit64 sqlite3_step sqlite3_stmt_busy sqlite3_stmt_readonly sqlite3_stmt_status +sqlite3_table_column_metadata sqlite3_total_changes64 +sqlite3_trace_go sqlite3_txn_state sqlite3_update_hook_go sqlite3_uri_key -sqlite3_uri_parameter sqlite3_value_blob sqlite3_value_bytes sqlite3_value_double sqlite3_value_dup sqlite3_value_free +sqlite3_value_frombind sqlite3_value_int64 sqlite3_value_nochange sqlite3_value_numeric_type diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index 2f36b2948d459958509396948142e5ce19a25291..173ad0e086d572c55752c13b2ca54cb100d6f863 100644 GIT binary patch literal 1401377 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

4U!0Rmhu%U`O4!_Jhn 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ƺ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%0DD&+>DNRfoitBMWw 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�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%0A_)X4 z(TGg=NM@cx=s7@=0>WpI!xamRq7&mSj6DkEjORZxBN{QbB`5J->f2ie?T-vHY@$>% zjIIV988R97O!V5T%f$#1av7`6pGDdFE{=C=7atCDGrrTf!x|7mH>~a9a-lfeA$GNR zKdY>?X0^$uNea|hlA7Y@peL>1xVy5{L#?z>UqXT5RPy)n5v)N`EEb?vX``h>WeVr`R6VFkyf9&n42>&O<=ajC0VXOw1v^EXN7bCGjuVZ z41-{0MF!*AtIV^&DC^^JQgEkUCeYE&0=Eux4%0yH6LkjHC+i2FUq$II+ekRu);U;M zcbS*TJm(|?!HWuB-mm}1AIEZefPrpF8c)3zk&EL{ja)UpHD2NW(@|NnT?Nd-KqtfK z-=f_6;-qtYcWU7y?xukhpE=)4;ySrm3}@4{o^63Nwj3j6F|wVrFXV6ZM$otXg@;HI z>$(Un%a8C;p=9G_#2m`nz)zJS4raTvo;`nE^Sa9T*s4)C5A4`6c5Ki_1eA|fhv~u` zwrS34@3n`xFhnTo793j$&6RgI4~aWT2TTxt^ABR=y5Vg;8kKFJOVrY;VHNm)M<7w{6pvm%Ia{*)SKizW0f{o$$QKC8m3*ums74Pwg6LoOKc zjzZ`i@`LF`th}P#oO|b zOxfgO1>Gf&<#r!WOo`syU~WCJR8MQ-AIzM4kY>d5Bjo|m6x5Mz8YLle2e3o|(8huo z)-B&vi=nM80&KoIG3N=(j!tn#kX8Wn$aSo8!T{I4@%6U;=4O2D&%OTg%PF**mlwY= zTY)JAsIzi*7v}T7Y~zen0raqOJ=8}0ffI%%(J=dUSAOzV_N#V8D_CK2)Kj<9kc-6O zSYE zq;ZFN-WpgBWFH%5n!`-XFyk1;@o~=N)mbf+LyoY%S;NSc>LedOD{6}o%QGw>m%1;3^F=2?9KnA=|#f? z(SWLpVgZ;od;u?Lg5?1_(9Aol=O7)-laHWMxQml3QjnzhMnH|Jp-CQHMt(TtCWtjY z2TL@0HRS(uaEj3c1V(611XjcY8M3?rCDq*zQ+^}}7qKPNp}s&HB6&!Puf}Kufn>E< zTS{{{(=`?Z)>3|UJT!jM;kc7yw(|E8zb8SIHJ2$_kB-yg{xE)IF@)5H!QA02Omi-y zx5%uDqWHx5d(XKx)h+CEo&2a`{o!%FKa|M;j!Htl8DVLzf*JcEnwhJJKaKDp`K0(! zZ-||UIzi?Ndku8{hyOBG;&TtCmCB3g5Jsv$jYb$K#rB8JQGFytSrBZGNN;#)dBC>` zHxh8yzGGeX@N=U-I_gB@hv&4iJhOJD=}F*Ym!knm$`d{3 zC}Wb!3Qi#pX%tF$;lwc4O5_Bim+#tTfk>+p#=Q;>N5q_HAKD$JG44tSkA^1 zIN;ag=J@jv>a!InLNh3;s5r*3h!q$pUl7h1J{AwTVUaJFixrK=W(<}cW1ojt6R6zM z6#0I;u0>YuDqH+H>RC*ng!+aeib0am3&c6$6>8&7TeRPODYm?KqB0zwf%qLIp@E7df6-mH%R+5 zfWXMWksO(;V{fpyCA_16$Zz{Po|pk^jvf&YkLo%;OXqD|U8FwJsd_Se zi89r;p_YX}&KGR9=YBEfCmyLn!!vX00GJgePCkwUgvM4;Tmu<_u)q(YaAR3iHMGqY zOvdT=uXb;WOYQy02*lP3lmvcVyZeib1gaQ`{~_te*Kc=Lr&6}G?`9x8TZc8A0m5Em zQV@gNZ+362iK+UnTA_6H*T>&>@e`nV@ia)i{r&CEGoXT>u%m7+K}HC91gt0df{R>f z-|u8XY2X>dsyl7hed44OfYZ!)F4A_~%XcqIg?SS2(;3@DIdd^r&wXVx1bt*YmWA%M%b&%v* z%y_6M?>gNG?y0fQJK_OG>TH90p!IoTRGxtP)4axm z-st{_Z~&jdjMzm{N9$-kTliRg2gPG8;0`;11P%$1dmqyDDAVMIdbJnOTY(eMZ)}mB z7fJ0ki4g8=xHImE2bgRJy>@74v+%^IJkdj6Z$VE`qXP4Qw^JZYAH@aH0f9~etVFyz zKVHiIAzq?wKY4Lk0amnX4Y0}`X-XB-m;0(ASTtrYPxN4MnDYRs6mB8jGs3A%z zJp35u%_z(D;^5qF5#^Am3p<0(BLs8(_RA$T-p;~7{(Zfn>QkSdV;tquAPr}bnUPzb zw0PnY)1ALTR9!iadX!lv9}X4R3E;TzpgYhROZF4%*XkFke*pWj@f+7? z@dgmMqP{omGTzH~-!&p1gH9sW^vbp7<^Ej&%)8bROzhvr#hWVZe4Bb?@HXM%2HvIJ zTN{Gsh21NC;ruVV8`~>ce7wFAi>AX6J4n)Q1-*;U06W?a`$L)T|Hm|w2Xr@@l-oQ7 zC6c*MaAl6TAKxnEL|lp9&!Wpxs=v2Qez+XZp0nKQ(K?q@LuBaTX(ObJ{j*W2bEXa=5Sp$*Qh??c&a;ZMd83|<`9EAW))4d8NCJifSOmEe z1M!Q?xj@eZB|gLY&3|V^@0+IN21;OvlLq0zG!N-U$}HIvp=-K3HL$d#B>WZ z6YkI_P?q!9c}T_elOf)BD7@BCgw{mPhhiHXrs9V*2d*Ng4*c*Kn4CRzAQ1z$VMnyH zNr(x!iH(>f0_t}54vZwk&*E39t_e{TPCX>{7{8)PuEqk)yGSf{+2bN)fX3)X( zbZPj7DM^|k-UwgHcg8W@Rh;w^Qr;vU=Ar)XdF};^xDm?yki9Tatmpi%*L^$j5t=3< z7#Uf^>1XOeu-HyW!*xyQ!xxLm#1cBIzhg6bu%rg)ZoVUIxIyU9Fz}&Kc_@f7V;UG% zLqzHHr&6ru?{;Ho6_u%y&ZTvD3l-jZQV7d#y0(@A!KWk=a^h0ds?2}5VUv3U-7!(6 z$9k(NM-E7h3ac<2@OMrdFi>MbbqK6#oe`wc2F+3+N6LDN)hLWyTO>%;rXuohmZ(Xu zTnb%t+Fu@`+Rs_hlcq5ig6grj*}pfChjKJxB3>-J48|N_B%htn|L(uuT*$QSRa`s? zf%}oKQSxc4=-BF%$SVI9)OFVqzvdZ@?>v^a)VbTs)wMUOJEJ>1D^O;`t2A*Vd&~z$o^xp-nS7#7|kzj!ZxzP%aX6ukDod z7jGu=TrR(WeZt-axWUw5cHN;N6ptVHj{MY44c!Kftn1~zAjPS$(t^P!F2#+M_gWB) zajE#?JxFPtyaQ9ODUe83QFexldB_W)!YQy!Og8&AZ&~h3Hly_qaiR}kUQFy!H}2&# z>qo3AtvqnDTKv1SB{lI#LYC$-jji!gpIE*P)Zs`kA81AO=qfiHS@AB@z=P3MBDT+1 z%(A#b5cTcXnq>>H?P}?AwC%Eey9J!h)pmL9i`6Ijw|V{LYrkB*ylP9)aNFA4r0!M; z$guO<_NKj8_S)r5CDRqIeSyD^aD@=ygZy#JdpN*&v+ro0{QSz zDKh+h4u7^iM_JQg-0dNQ9(lS9Io%raOnWZs3(qkW!zQT;x5EY*-M2kPu2@U zZBcT% zv9>3J^4mCEur%;#=OE6TCRSHzwIbXHf3ZKqNQ>efnMaB-P*kuds z;DvKBm>;gdbKEyPQDcta{hQ%kVVrrQ1{d@>#i563C<`J9JulBgTXF~Q_AHIa%}3no zo|ZD!t1W*xOCx-ad7PzzTAt)t4pz7U`ubIY6Q(cJtM;Z<2=^dW>L0o}Ut%nR*5&=~ zXzz}5;7d8qfu|OKwO(HIVfSnU;ybIKfbvWoJjB=U|MKWv^^beu``8}$v2Q{2#BYHD ziRnYz2`5O1P7d>CYVm!gW?2ycw7MHRg9^f5Vo^0c}rMe640MX5B(-(L-rSgE)7>v{BeEtjUs1vb)Fm6 zb!^{GbX{LD9|-sj%r8K>Uz6;?5~e|TL^*SBkP)WQ4~cqZ?rgX-?uZ8lVH#6?eV9f+ zB%iyRJdnDO zhJoV45QZV5;3V{|8aV|@EI*(^7Z26CCxZM0@$DpkzKr>z~%?b=vXX zP-9bs2MoZEpDE4Q4Zj^d)cj#>r@}S;p7K7bdwqWsOJr|F4iiv$ln*TrP-{rfT z&+zx5=BEihFcgj|>NB^QQ~v68tRYXQ4Y^Q?yY|xa-jj)8HqMK>)(zP;okax_d56IqC*JZ z2~qSl&TU(tGJODRbN0T@$+!Gr?r|=6F&jbX-unOW4N5K^xsvK?&-DuX%!(%Kou=!@ z&>bP%r|YXILnn=~r$&@EvEESk>NXa%J*OeJ)1K3Klrqx5LmQkd-S6rcq%G-==_pwO zw5FpZhH=EVP{SCKLUaHG2dH4=pWd((7N8;*$%RY=iyKNyPBbOoFZBq;n@df1lz3u7z(9feKBq@CKwbZ$33Md{!$qY8ix z1G=hFD~gr^;d(3g_K&T9zh3_V;9kT}36JtJe;!J~d97M5bHiiHMVR=(_K=Y~->1EI z{m9m8T#nU15nYy%3tW7FNJ4~x_{Ud7n^K?jB8;CeXOo9|BgbSgr%`X@SnQ#xdpX9y z3`kF@BFX9^$*gX7g^7!OCv-Vekk7UqmQ}h}tM={TumAu)7e31rQZIOeYU>nS%IIK+ zmOm@RTTZMyGS#iH@!w28!rJ6raRr>U8`J%(U&RN~1MTt^?pABJ51hG>*Op6GC9V=u z`r}y)kH9ha4D(}0uGtWBk>1>YSg-#mmg)j5a9Eh5Vi_L2a~Z&ntYs!&)8Mi_dN+E+ zs5UT7H+qDhFRuc_)6F8x$|6iRixB!|I$Q+iw^1k4vIx_%2t@c?gt3b-jz#Fz$+1NM zfLsKto;Qmy-7EsaL>)8TS_A|ES*45EsIg0c%_*?K@*8CH+@>6R&-(4j2nh}tVp>LF zwGjNMa~my9B&b+3F!mt$A%;e8B9J{!&C?Wp5P|EUbCWk<*lj!Q@>#S5S1;+4p|*m3 zauL?`62E+TAOC055HH+cnq`;)CUTYk&cB@`14h&R_>13&99urf7x?*rS07!c6VHnB zoVQU&!v@ktd$GL_i%#bffiqdw?SZ{77);NjteISFyi4!Ixe`hCoAwa3-t7{Wh9VnG z^%mM|J=0~}-owwpbx(?dOCiT2Ox5YC1<@O_!^=a;dfSCG#BfqGu^60KAZjn1nN{sK zW^dB-F2F*pniB!G(p#@CdJYE0N=Hp}i#Yg&2 z*zGYh`;vE`_WMu2p{W6Mpx~g58IZnXotF2&crr;1`1f63-iPgW|8-Vq(td*}sJ#}6 z&f55=3zN6^1ZT!V!&HT(Nk{f99b349rM>##F_sSUBs|pz%LO3h^#+e%rr=S@!^@$= zsMLo%-=wbiaF{SUJjI3Gsw*}V!@3VQkMcH|A#|8Wld6^JjDjJCQac+LBzy!@(@B`X zC8~H;cMU|d5MrZ&SkXL{0A_U6BY_tw+)DW6vrg(2vja{-k=NSh1<<=L^gcwwQ4ZE%0m7z80wi;rg)zYpu ze#BsTmv>c4HfV9@9Pib6xVODm-euWGGlX_{$oE|hwKE(F0dS5G^Z`XiN@r^g zp~{W*(wuC)gbOpUUUY|)tOM&M+DdJ#7fJSX+Xd#(6>hX$+#28N3a?O5?Iu2-;c1|2 zdsnzOQ;xa91i_0j0~^P@5PLj1v`xB_HLL8lEE0D-C+}k~=#jmdn<&gzu47;Xsp*iJ z$Ee=3ge`fo`4~_d)etm&T@(7qoP;ha97{EsKO5EwPffxN4-`eNH%^t%3lIqXw)hwg z$C~wzj?^3DZd39YEXCv)-IOCU|M}(yF1+={{iRagbb-*}Mc=5z zi@w2`SKmyFo|$HTi4X)k5TPOU`Lr~`A{wF4Z>P(9m5Nr*u!En3${kYCBuf`lS^Nu> zioWNqrQ+hNm5Pg@D4PwX;_Ry(YBn5dx4jp27b*(r7*tE#Q9@ z;7pXf!mX}Tld>TE{B!HdF(R%+4O5kO)ZVeK=JM>BEj4)Ns|Ehd5P0QIzQg#!)f<

JIs?QAJ*qN5^KYh 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�?LeA8555@T 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±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 literal 1337796 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�4s$jO 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 z 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 z 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

5F#shiJhOGK;>S?6r0b4?(4Bu_AU10vVDt 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

^!=l&;e;9 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"`xz^S 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 cap { + b.buf = append(b.buf[:cap], make([]byte, size-cap)...) + } else { + b.buf = b.buf[:size] + } + return b.buf +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go similarity index 78% rename from vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go rename to vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go index 23c5382375..2948487f68 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/alloc.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_unix.go @@ -1,6 +1,6 @@ -//go:build unix +//go:build unix && !sqlite3_nosys -package util +package alloc import ( "math" @@ -9,30 +9,24 @@ import ( "golang.org/x/sys/unix" ) -func mmappedAllocator(cap, max uint64) experimental.LinearMemory { +func NewMemory(_, max uint64) experimental.LinearMemory { // Round up to the page size. rnd := uint64(unix.Getpagesize() - 1) max = (max + rnd) &^ rnd - cap = (cap + rnd) &^ rnd if max > math.MaxInt { // This ensures int(max) overflows to a negative value, // and unix.Mmap returns EINVAL. max = math.MaxUint64 } + // Reserve max bytes of address space, to ensure we won't need to move it. // A protected, private, anonymous mapping should not commit memory. b, err := unix.Mmap(-1, 0, int(max), unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON) if err != nil { panic(err) } - // Commit the initial cap bytes of memory. - err = unix.Mprotect(b[:cap], unix.PROT_READ|unix.PROT_WRITE) - if err != nil { - unix.Munmap(b) - panic(err) - } - return &mmappedMemory{buf: b[:cap]} + return &mmappedMemory{buf: b[:0]} } // The slice covers the entire mmapped memory: @@ -43,7 +37,9 @@ type mmappedMemory struct { } func (m *mmappedMemory) Reallocate(size uint64) []byte { - if com := uint64(len(m.buf)); com < size { + com := uint64(len(m.buf)) + res := uint64(cap(m.buf)) + if com < size && size <= res { // Round up to the page size. rnd := uint64(unix.Getpagesize() - 1) new := (size + rnd) &^ rnd @@ -51,7 +47,7 @@ func (m *mmappedMemory) Reallocate(size uint64) []byte { // Commit additional memory up to new bytes. err := unix.Mprotect(m.buf[com:new], unix.PROT_READ|unix.PROT_WRITE) if err != nil { - panic(err) + return nil } // Update committed memory. diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go new file mode 100644 index 0000000000..8e67e03192 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/alloc/alloc_windows.go @@ -0,0 +1,76 @@ +//go:build !sqlite3_nosys + +package alloc + +import ( + "math" + "reflect" + "unsafe" + + "github.com/tetratelabs/wazero/experimental" + "golang.org/x/sys/windows" +) + +func NewMemory(_, max uint64) experimental.LinearMemory { + // Round up to the page size. + rnd := uint64(windows.Getpagesize() - 1) + max = (max + rnd) &^ rnd + + if max > math.MaxInt { + // This ensures uintptr(max) overflows to a large value, + // and windows.VirtualAlloc returns an error. + max = math.MaxUint64 + } + + // Reserve max bytes of address space, to ensure we won't need to move it. + // This does not commit memory. + r, err := windows.VirtualAlloc(0, uintptr(max), windows.MEM_RESERVE, windows.PAGE_READWRITE) + if err != nil { + panic(err) + } + + mem := virtualMemory{addr: r} + // SliceHeader, although deprecated, avoids a go vet warning. + sh := (*reflect.SliceHeader)(unsafe.Pointer(&mem.buf)) + sh.Cap = int(max) + sh.Data = r + return &mem +} + +// The slice covers the entire mmapped memory: +// - len(buf) is the already committed memory, +// - cap(buf) is the reserved address space. +type virtualMemory struct { + buf []byte + addr uintptr +} + +func (m *virtualMemory) Reallocate(size uint64) []byte { + com := uint64(len(m.buf)) + res := uint64(cap(m.buf)) + if com < size && size <= res { + // Round up to the page size. + rnd := uint64(windows.Getpagesize() - 1) + new := (size + rnd) &^ rnd + + // Commit additional memory up to new bytes. + _, err := windows.VirtualAlloc(m.addr, uintptr(new), windows.MEM_COMMIT, windows.PAGE_READWRITE) + if err != nil { + return nil + } + + // Update committed memory. + m.buf = m.buf[:new] + } + // Limit returned capacity because bytes beyond + // len(m.buf) have not yet been committed. + return m.buf[:size:len(m.buf)] +} + +func (m *virtualMemory) Free() { + err := windows.VirtualFree(m.addr, 0, windows.MEM_RELEASE) + if err != nil { + panic(err) + } + m.addr = 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go deleted file mode 100644 index 8427f30850..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/bool.go +++ /dev/null @@ -1,22 +0,0 @@ -package util - -import "strings" - -func ParseBool(s string) (b, ok bool) { - if len(s) == 0 { - return false, false - } - if s[0] == '0' { - return false, true - } - if '1' <= s[0] && s[0] <= '9' { - return true, true - } - switch strings.ToLower(s) { - case "true", "yes", "on": - return true, true - case "false", "no", "off": - return false, true - } - return false, false -} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go index 86bb9749db..5e89018ddf 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/const.go @@ -1,6 +1,6 @@ package util -// https://sqlite.com/matrix/rescode.html +// https://sqlite.com/rescode.html const ( OK = 0 /* Successful result */ diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/error.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/error.go index 1f5555fd3e..2aecac96e6 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/error.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/error.go @@ -104,3 +104,13 @@ func ErrorCodeString(rc uint32) string { } return "sqlite3: unknown error" } + +type ErrorJoiner []error + +func (j *ErrorJoiner) Join(errs ...error) { + for _, err := range errs { + if err != nil { + *j = append(*j, err) + } + } +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index be7a47c2f7..468ff741ca 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -26,6 +26,7 @@ func ExportFuncVI[T0 i32](mod wazero.HostModuleBuilder, name string, fn func(con type funcVII[T0, T1 i32] func(context.Context, api.Module, T0, T1) func (fn funcVII[T0, T1]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[1] // prevent bounds check on every slice access fn(ctx, mod, T0(stack[0]), T1(stack[1])) } @@ -39,6 +40,7 @@ func ExportFuncVII[T0, T1 i32](mod wazero.HostModuleBuilder, name string, fn fun type funcVIII[T0, T1, T2 i32] func(context.Context, api.Module, T0, T1, T2) func (fn funcVIII[T0, T1, T2]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[2] // prevent bounds check on every slice access fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2])) } @@ -52,6 +54,7 @@ func ExportFuncVIII[T0, T1, T2 i32](mod wazero.HostModuleBuilder, name string, f type funcVIIII[T0, T1, T2, T3 i32] func(context.Context, api.Module, T0, T1, T2, T3) func (fn funcVIIII[T0, T1, T2, T3]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[3] // prevent bounds check on every slice access fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3])) } @@ -65,6 +68,7 @@ func ExportFuncVIIII[T0, T1, T2, T3 i32](mod wazero.HostModuleBuilder, name stri type funcVIIIII[T0, T1, T2, T3, T4 i32] func(context.Context, api.Module, T0, T1, T2, T3, T4) func (fn funcVIIIII[T0, T1, T2, T3, T4]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[4] // prevent bounds check on every slice access fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]), T4(stack[4])) } @@ -78,6 +82,7 @@ func ExportFuncVIIIII[T0, T1, T2, T3, T4 i32](mod wazero.HostModuleBuilder, name type funcVIIIIJ[T0, T1, T2, T3 i32, T4 i64] func(context.Context, api.Module, T0, T1, T2, T3, T4) func (fn funcVIIIIJ[T0, T1, T2, T3, T4]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[4] // prevent bounds check on every slice access fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]), T4(stack[4])) } @@ -104,6 +109,7 @@ func ExportFuncII[TR, T0 i32](mod wazero.HostModuleBuilder, name string, fn func type funcIII[TR, T0, T1 i32] func(context.Context, api.Module, T0, T1) TR func (fn funcIII[TR, T0, T1]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[1] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]))) } @@ -117,6 +123,7 @@ func ExportFuncIII[TR, T0, T1 i32](mod wazero.HostModuleBuilder, name string, fn type funcIIII[TR, T0, T1, T2 i32] func(context.Context, api.Module, T0, T1, T2) TR func (fn funcIIII[TR, T0, T1, T2]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[2] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]))) } @@ -130,6 +137,7 @@ func ExportFuncIIII[TR, T0, T1, T2 i32](mod wazero.HostModuleBuilder, name strin type funcIIIII[TR, T0, T1, T2, T3 i32] func(context.Context, api.Module, T0, T1, T2, T3) TR func (fn funcIIIII[TR, T0, T1, T2, T3]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[3] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]))) } @@ -143,6 +151,7 @@ func ExportFuncIIIII[TR, T0, T1, T2, T3 i32](mod wazero.HostModuleBuilder, name type funcIIIIII[TR, T0, T1, T2, T3, T4 i32] func(context.Context, api.Module, T0, T1, T2, T3, T4) TR func (fn funcIIIIII[TR, T0, T1, T2, T3, T4]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[4] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]), T4(stack[4]))) } @@ -156,6 +165,7 @@ func ExportFuncIIIIII[TR, T0, T1, T2, T3, T4 i32](mod wazero.HostModuleBuilder, type funcIIIIIII[TR, T0, T1, T2, T3, T4, T5 i32] func(context.Context, api.Module, T0, T1, T2, T3, T4, T5) TR func (fn funcIIIIIII[TR, T0, T1, T2, T3, T4, T5]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[5] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]), T4(stack[4]), T5(stack[5]))) } @@ -169,6 +179,7 @@ func ExportFuncIIIIIII[TR, T0, T1, T2, T3, T4, T5 i32](mod wazero.HostModuleBuil type funcIIIIJ[TR, T0, T1, T2 i32, T3 i64] func(context.Context, api.Module, T0, T1, T2, T3) TR func (fn funcIIIIJ[TR, T0, T1, T2, T3]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[3] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2]), T3(stack[3]))) } @@ -182,6 +193,7 @@ func ExportFuncIIIIJ[TR, T0, T1, T2 i32, T3 i64](mod wazero.HostModuleBuilder, n type funcIIJ[TR, T0 i32, T1 i64] func(context.Context, api.Module, T0, T1) TR func (fn funcIIJ[TR, T0, T1]) Call(ctx context.Context, mod api.Module, stack []uint64) { + _ = stack[1] // prevent bounds check on every slice access stack[0] = uint64(fn(ctx, mod, T0(stack[0]), T1(stack[1]))) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go index 4584324c1b..e4e3385491 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go @@ -35,17 +35,22 @@ func DelHandle(ctx context.Context, id uint32) error { s := ctx.Value(moduleKey{}).(*moduleState) a := s.handles[^id] s.handles[^id] = nil - s.holes++ + if l := uint32(len(s.handles)); l == ^id { + s.handles = s.handles[:l-1] + } else { + s.holes++ + } if c, ok := a.(io.Closer); ok { return c.Close() } return nil } -func AddHandle(ctx context.Context, a any) (id uint32) { +func AddHandle(ctx context.Context, a any) uint32 { if a == nil { panic(NilErr) } + s := ctx.Value(moduleKey{}).(*moduleState) // Find an empty slot. diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go index c0ba38cf05..7f6849a429 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/json.go @@ -26,7 +26,7 @@ func (j JSON) Scan(value any) error { buf = v.AppendFormat(buf, time.RFC3339Nano) buf = append(buf, '"') case nil: - buf = append(buf, "null"...) + buf = []byte("null") default: panic(AssertErr()) } diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/math.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/math.go new file mode 100644 index 0000000000..a95f73764e --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/math.go @@ -0,0 +1,29 @@ +package util + +import "math" + +func abs(n int) int { + if n < 0 { + return -n + } + return n +} + +func GCD(m, n int) int { + for n != 0 { + m, n = n, m%n + } + return abs(m) +} + +func LCM(m, n int) int { + if n == 0 { + return 0 + } + return abs(n) * (abs(m) / GCD(m, n)) +} + +// https://developer.nvidia.com/blog/lerp-faster-cuda/ +func Lerp(v0, v1, t float64) float64 { + return math.FMA(t, v1, math.FMA(-t, v0, v0)) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go index 26f30beaa8..613bb90b11 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap.go @@ -1,4 +1,4 @@ -//go:build (darwin || linux) && (amd64 || arm64 || riscv64) && !(sqlite3_flock || sqlite3_noshm || sqlite3_nosys) +//go:build unix && !sqlite3_nosys package util @@ -8,15 +8,9 @@ import ( "unsafe" "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/experimental" "golang.org/x/sys/unix" ) -func withMmappedAllocator(ctx context.Context) context.Context { - return experimental.WithMemoryAllocator(ctx, - experimental.MemoryAllocatorFunc(mmappedAllocator)) -} - type mmapState struct { regions []*MappedRegion } @@ -31,7 +25,7 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped // Allocate page aligned memmory. alloc := mod.ExportedFunction("aligned_alloc") - stack := [2]uint64{ + stack := [...]uint64{ uint64(unix.Getpagesize()), uint64(size), } @@ -45,7 +39,7 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped // Save the newly allocated region. ptr := uint32(stack[0]) buf := View(mod, ptr, uint64(size)) - addr := uintptr(unsafe.Pointer(&buf[0])) + addr := unsafe.Pointer(&buf[0]) s.regions = append(s.regions, &MappedRegion{ Ptr: ptr, addr: addr, @@ -55,16 +49,16 @@ func (s *mmapState) new(ctx context.Context, mod api.Module, size int32) *Mapped } type MappedRegion struct { - addr uintptr + addr unsafe.Pointer Ptr uint32 size int32 used bool } -func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32, prot int) (*MappedRegion, error) { +func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32, readOnly bool) (*MappedRegion, error) { s := ctx.Value(moduleKey{}).(*moduleState) r := s.new(ctx, mod, size) - err := r.mmap(f, offset, prot) + err := r.mmap(f, offset, readOnly) if err != nil { return nil, err } @@ -75,23 +69,19 @@ func (r *MappedRegion) Unmap() error { // We can't munmap the region, otherwise it could be remaped. // Instead, convert it to a protected, private, anonymous mapping. // If successful, it can be reused for a subsequent mmap. - _, err := mmap(r.addr, uintptr(r.size), - unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_ANON|unix.MAP_FIXED, - -1, 0) + _, err := unix.MmapPtr(-1, 0, r.addr, uintptr(r.size), + unix.PROT_NONE, unix.MAP_PRIVATE|unix.MAP_FIXED|unix.MAP_ANON) r.used = err != nil return err } -func (r *MappedRegion) mmap(f *os.File, offset int64, prot int) error { - _, err := mmap(r.addr, uintptr(r.size), - prot, unix.MAP_SHARED|unix.MAP_FIXED, - int(f.Fd()), offset) +func (r *MappedRegion) mmap(f *os.File, offset int64, readOnly bool) error { + prot := unix.PROT_READ + if !readOnly { + prot |= unix.PROT_WRITE + } + _, err := unix.MmapPtr(int(f.Fd()), offset, r.addr, uintptr(r.size), + prot, unix.MAP_SHARED|unix.MAP_FIXED) r.used = err == nil return err } - -// We need the low level mmap for MAP_FIXED to work. -// Bind the syscall version hoping that it is more stable. - -//go:linkname mmap syscall.mmap -func mmap(addr, length uintptr, prot, flag, fd int, pos int64) (*byte, error) diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go index 89631e0939..e11f953a7a 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_other.go @@ -1,11 +1,5 @@ -//go:build !(darwin || linux) || !(amd64 || arm64 || riscv64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys +//go:build !unix || sqlite3_nosys package util -import "context" - type mmapState struct{} - -func withMmappedAllocator(ctx context.Context) context.Context { - return ctx -} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go new file mode 100644 index 0000000000..fdf6f439aa --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/mmap_windows.go @@ -0,0 +1,53 @@ +//go:build !sqlite3_nosys + +package util + +import ( + "context" + "os" + "reflect" + "unsafe" + + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/windows" +) + +type MappedRegion struct { + windows.Handle + Data []byte + addr uintptr +} + +func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32) (*MappedRegion, error) { + h, err := windows.CreateFileMapping(windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE, 0, 0, nil) + if h == 0 { + return nil, err + } + + a, err := windows.MapViewOfFile(h, windows.FILE_MAP_WRITE, + uint32(offset>>32), uint32(offset), uintptr(size)) + if a == 0 { + windows.CloseHandle(h) + return nil, err + } + + res := &MappedRegion{Handle: h, addr: a} + // SliceHeader, although deprecated, avoids a go vet warning. + sh := (*reflect.SliceHeader)(unsafe.Pointer(&res.Data)) + sh.Len = int(size) + sh.Cap = int(size) + sh.Data = a + return res, nil +} + +func (r *MappedRegion) Unmap() error { + if r.Data == nil { + return nil + } + err := windows.UnmapViewOfFile(r.addr) + if err != nil { + return err + } + r.Data = nil + return windows.CloseHandle(r.Handle) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go index 20b17b2097..4089dcab9b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/module.go @@ -4,6 +4,8 @@ import ( "context" "github.com/tetratelabs/wazero/experimental" + + "github.com/ncruces/go-sqlite3/internal/alloc" ) type moduleKey struct{} @@ -14,7 +16,7 @@ type moduleState struct { func NewContext(ctx context.Context) context.Context { state := new(moduleState) - ctx = withMmappedAllocator(ctx) + ctx = experimental.WithMemoryAllocator(ctx, experimental.MemoryAllocatorFunc(alloc.NewMemory)) ctx = experimental.WithCloseNotifier(ctx, state) ctx = context.WithValue(ctx, moduleKey{}, state) return ctx diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/set.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/set.go new file mode 100644 index 0000000000..9cfd5abd18 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/set.go @@ -0,0 +1,12 @@ +package util + +type Set[E comparable] map[E]struct{} + +func (s Set[E]) Add(v E) { + s[v] = struct{}{} +} + +func (s Set[E]) Contains(v E) bool { + _, ok := s[v] + return ok +} diff --git a/vendor/github.com/ncruces/go-sqlite3/json.go b/vendor/github.com/ncruces/go-sqlite3/json.go index 9b2565e87c..2b762c092f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/json.go +++ b/vendor/github.com/ncruces/go-sqlite3/json.go @@ -5,7 +5,8 @@ import "github.com/ncruces/go-sqlite3/internal/util" // JSON returns a value that can be used as an argument to // [database/sql.DB.Exec], [database/sql.Row.Scan] and similar methods to // store value as JSON, or decode JSON into value. -// JSON should NOT be used with [BindJSON] or [ResultJSON]. +// JSON should NOT be used with [Stmt.BindJSON], [Stmt.ColumnJSON], +// [Value.JSON], or [Context.ResultJSON]. func JSON(value any) any { return util.JSON{Value: value} } diff --git a/vendor/github.com/ncruces/go-sqlite3/pointer.go b/vendor/github.com/ncruces/go-sqlite3/pointer.go index 611c1528ce..0e2418b992 100644 --- a/vendor/github.com/ncruces/go-sqlite3/pointer.go +++ b/vendor/github.com/ncruces/go-sqlite3/pointer.go @@ -4,7 +4,8 @@ import "github.com/ncruces/go-sqlite3/internal/util" // Pointer returns a pointer to a value that can be used as an argument to // [database/sql.DB.Exec] and similar methods. -// Pointer should NOT be used with [BindPointer] or [ResultPointer]. +// Pointer should NOT be used with [Stmt.BindPointer], +// [Value.Pointer], or [Context.ResultPointer]. // // https://sqlite.org/bindptr.html func Pointer[T any](value T) any { diff --git a/vendor/github.com/ncruces/go-sqlite3/quote.go b/vendor/github.com/ncruces/go-sqlite3/quote.go index d1cd6fa875..abe516debe 100644 --- a/vendor/github.com/ncruces/go-sqlite3/quote.go +++ b/vendor/github.com/ncruces/go-sqlite3/quote.go @@ -3,6 +3,7 @@ package sqlite3 import ( "bytes" "math" + "reflect" "strconv" "strings" "time" @@ -13,6 +14,9 @@ import ( // Quote escapes and quotes a value // making it safe to embed in SQL text. +// Strings with embedded NUL characters are truncated. +// +// https://sqlite.org/lang_corefunc.html#quote func Quote(value any) string { switch v := value.(type) { case nil: @@ -42,8 +46,8 @@ func Quote(value any) string { return "'" + v.Format(time.RFC3339Nano) + "'" case string: - if strings.IndexByte(v, 0) >= 0 { - break + if i := strings.IndexByte(v, 0); i >= 0 { + v = v[:i] } buf := make([]byte, 2+len(v)+strings.Count(v, "'")) @@ -57,13 +61,13 @@ func Quote(value any) string { buf[i] = b i += 1 } - buf[i] = '\'' + buf[len(buf)-1] = '\'' return unsafe.String(&buf[0], len(buf)) case []byte: buf := make([]byte, 3+2*len(v)) - buf[0] = 'x' buf[1] = '\'' + buf[0] = 'x' i := 2 for _, b := range v { const hex = "0123456789ABCDEF" @@ -71,26 +75,50 @@ func Quote(value any) string { buf[i+1] = hex[b%16] i += 2 } - buf[i] = '\'' + buf[len(buf)-1] = '\'' return unsafe.String(&buf[0], len(buf)) case ZeroBlob: - if v > ZeroBlob(1e9-3)/2 { - break - } - buf := bytes.Repeat([]byte("0"), int(3+2*int64(v))) - buf[0] = 'x' buf[1] = '\'' + buf[0] = 'x' buf[len(buf)-1] = '\'' return unsafe.String(&buf[0], len(buf)) } + v := reflect.ValueOf(value) + k := v.Kind() + + if k == reflect.Interface || k == reflect.Pointer { + if v.IsNil() { + return "NULL" + } + v = v.Elem() + k = v.Kind() + } + + switch { + case v.CanInt(): + return strconv.FormatInt(v.Int(), 10) + case v.CanUint(): + return strconv.FormatUint(v.Uint(), 10) + case v.CanFloat(): + return Quote(v.Float()) + case k == reflect.Bool: + return Quote(v.Bool()) + case k == reflect.String: + return Quote(v.String()) + case (k == reflect.Slice || k == reflect.Array && v.CanAddr()) && + v.Type().Elem().Kind() == reflect.Uint8: + return Quote(v.Bytes()) + } + panic(util.ValueErr) } // QuoteIdentifier escapes and quotes an identifier // making it safe to embed in SQL text. +// Strings with embedded NUL characters panic. func QuoteIdentifier(id string) string { if strings.IndexByte(id, 0) >= 0 { panic(util.ValueErr) @@ -107,6 +135,6 @@ func QuoteIdentifier(id string) string { buf[i] = b i += 1 } - buf[i] = '"' + buf[len(buf)-1] = '"' return unsafe.String(&buf[0], len(buf)) } diff --git a/vendor/github.com/ncruces/go-sqlite3/registry.go b/vendor/github.com/ncruces/go-sqlite3/registry.go new file mode 100644 index 0000000000..043d69eeb5 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/registry.go @@ -0,0 +1,30 @@ +package sqlite3 + +import "sync" + +var ( + // +checklocks:extRegistryMtx + extRegistry []func(*Conn) error + extRegistryMtx sync.RWMutex +) + +// AutoExtension causes the entryPoint function to be invoked +// for each new database connection that is created. +// +// https://sqlite.org/c3ref/auto_extension.html +func AutoExtension(entryPoint func(*Conn) error) { + extRegistryMtx.Lock() + defer extRegistryMtx.Unlock() + extRegistry = append(extRegistry, entryPoint) +} + +func initExtensions(c *Conn) error { + extRegistryMtx.RLock() + defer extRegistryMtx.RUnlock() + for _, f := range extRegistry { + if err := f(c); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/sqlite.go b/vendor/github.com/ncruces/go-sqlite3/sqlite.go index a446ec0d1e..2afe9971cb 100644 --- a/vendor/github.com/ncruces/go-sqlite3/sqlite.go +++ b/vendor/github.com/ncruces/go-sqlite3/sqlite.go @@ -9,10 +9,12 @@ import ( "sync" "unsafe" - "github.com/ncruces/go-sqlite3/internal/util" - "github.com/ncruces/go-sqlite3/vfs" "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/ncruces/go-sqlite3/vfs" ) // Configure SQLite Wasm. @@ -28,6 +30,14 @@ var ( RuntimeConfig wazero.RuntimeConfig ) +// Initialize decodes and compiles the SQLite Wasm binary. +// This is called implicitly when the first connection is openned, +// but is potentially slow, so you may want to call it at a more convenient time. +func Initialize() error { + instance.once.Do(compileSQLite) + return instance.err +} + var instance struct { runtime wazero.Runtime compiled wazero.CompiledModule @@ -36,12 +46,19 @@ var instance struct { } func compileSQLite() { - if RuntimeConfig == nil { - RuntimeConfig = wazero.NewRuntimeConfig() + ctx := context.Background() + cfg := RuntimeConfig + if cfg == nil { + cfg = wazero.NewRuntimeConfig() + if bits.UintSize >= 64 { + cfg = cfg.WithMemoryLimitPages(4096) // 256MB + } else { + cfg = cfg.WithMemoryLimitPages(512) // 32MB + } } + cfg = cfg.WithCoreFeatures(api.CoreFeaturesV2 | experimental.CoreFeaturesThreads) - ctx := context.Background() - instance.runtime = wazero.NewRuntimeWithConfig(ctx, RuntimeConfig) + instance.runtime = wazero.NewRuntimeWithConfig(ctx, cfg) env := instance.runtime.NewHostModuleBuilder("env") env = vfs.ExportHostFunctions(env) @@ -74,14 +91,12 @@ type sqlite struct { id [32]*byte mask uint32 } - stack [8]uint64 - freer uint32 + stack [9]uint64 } func instantiateSQLite() (sqlt *sqlite, err error) { - instance.once.Do(compileSQLite) - if instance.err != nil { - return nil, instance.err + if err := Initialize(); err != nil { + return nil, err } sqlt = new(sqlite) @@ -92,14 +107,7 @@ func instantiateSQLite() (sqlt *sqlite, err error) { if err != nil { return nil, err } - - global := sqlt.mod.ExportedGlobal("malloc_destructor") - if global == nil { - return nil, util.BadBinaryErr - } - - sqlt.freer = util.ReadUint32(sqlt.mod, uint32(global.Get())) - if sqlt.freer == 0 { + if sqlt.getfn("sqlite3_progress_handler_go") == nil { return nil, util.BadBinaryErr } return sqlt, nil @@ -129,7 +137,7 @@ func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { err.msg = util.ReadString(sqlt.mod, uint32(r), _MAX_LENGTH) } - if sql != nil { + if len(sql) != 0 { if r := sqlt.call("sqlite3_error_offset", uint64(handle)); r != math.MaxUint32 { err.sql = sql[0][r:] } @@ -186,14 +194,19 @@ func (sqlt *sqlite) free(ptr uint32) { if ptr == 0 { return } - sqlt.call("free", uint64(ptr)) + sqlt.call("sqlite3_free", uint64(ptr)) } func (sqlt *sqlite) new(size uint64) uint32 { - if size > _MAX_ALLOCATION_SIZE { + ptr := uint32(sqlt.call("sqlite3_malloc64", size)) + if ptr == 0 && size != 0 { panic(util.OOMErr) } - ptr := uint32(sqlt.call("malloc", size)) + return ptr +} + +func (sqlt *sqlite) realloc(ptr uint32, size uint64) uint32 { + ptr = uint32(sqlt.call("sqlite3_realloc64", uint64(ptr), size)) if ptr == 0 && size != 0 { panic(util.OOMErr) } @@ -204,7 +217,11 @@ func (sqlt *sqlite) newBytes(b []byte) uint32 { if (*[0]byte)(b) == nil { return 0 } - ptr := sqlt.new(uint64(len(b))) + size := len(b) + if size == 0 { + size = 1 + } + ptr := sqlt.new(uint64(size)) util.WriteBytes(sqlt.mod, ptr, b) return ptr } @@ -289,12 +306,14 @@ func (a *arena) string(s string) uint32 { } func exportCallbacks(env wazero.HostModuleBuilder) wazero.HostModuleBuilder { - util.ExportFuncIII(env, "go_busy_handler", busyCallback) util.ExportFuncII(env, "go_progress_handler", progressCallback) + util.ExportFuncIII(env, "go_busy_timeout", timeoutCallback) + util.ExportFuncIII(env, "go_busy_handler", busyCallback) util.ExportFuncII(env, "go_commit_hook", commitCallback) util.ExportFuncVI(env, "go_rollback_hook", rollbackCallback) util.ExportFuncVIIIIJ(env, "go_update_hook", updateCallback) util.ExportFuncIIIII(env, "go_wal_hook", walCallback) + util.ExportFuncIIIII(env, "go_trace", traceCallback) util.ExportFuncIIIIII(env, "go_autovacuum_pages", autoVacuumCallback) util.ExportFuncIIIIIII(env, "go_authorizer", authorizerCallback) util.ExportFuncVIII(env, "go_log", logCallback) diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index fc26b1e95e..139dd3525c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -15,6 +15,7 @@ import ( type Stmt struct { c *Conn err error + sql string handle uint32 } @@ -29,6 +30,16 @@ func (s *Stmt) Close() error { } r := s.c.call("sqlite3_finalize", uint64(s.handle)) + stmts := s.c.stmts + for i := range stmts { + if s == stmts[i] { + l := len(stmts) - 1 + stmts[i] = stmts[l] + stmts[l] = nil + s.c.stmts = stmts[:l] + break + } + } s.handle = 0 return s.c.error(r) @@ -41,6 +52,24 @@ func (s *Stmt) Conn() *Conn { return s.c } +// SQL returns the SQL text used to create the prepared statement. +// +// https://sqlite.org/c3ref/expanded_sql.html +func (s *Stmt) SQL() string { + return s.sql +} + +// ExpandedSQL returns the SQL text of the prepared statement +// with bound parameters expanded. +// +// https://sqlite.org/c3ref/expanded_sql.html +func (s *Stmt) ExpandedSQL() string { + r := s.c.call("sqlite3_expanded_sql", uint64(s.handle)) + sql := util.ReadString(s.c.mod, uint32(r), _MAX_SQL_LENGTH) + s.c.free(uint32(r)) + return sql +} + // ReadOnly returns true if and only if the statement // makes no direct changes to the content of the database file. // @@ -77,7 +106,7 @@ func (s *Stmt) Busy() bool { // // https://sqlite.org/c3ref/step.html func (s *Stmt) Step() bool { - s.c.checkInterrupt() + s.c.checkInterrupt(s.c.handle) r := s.c.call("sqlite3_step", uint64(s.handle)) switch r { case _ROW: @@ -218,15 +247,15 @@ func (s *Stmt) BindText(param int, value string) error { return TOOBIG } ptr := s.c.newString(value) - r := s.c.call("sqlite3_bind_text64", + r := s.c.call("sqlite3_bind_text_go", uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value)), - uint64(s.c.freer), _UTF8) + uint64(ptr), uint64(len(value))) return s.c.error(r) } // BindRawText binds a []byte to the prepared statement as text. // The leftmost SQL parameter has an index of 1. +// Binding a nil slice is the same as calling [Stmt.BindNull]. // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindRawText(param int, value []byte) error { @@ -234,10 +263,9 @@ func (s *Stmt) BindRawText(param int, value []byte) error { return TOOBIG } ptr := s.c.newBytes(value) - r := s.c.call("sqlite3_bind_text64", + r := s.c.call("sqlite3_bind_text_go", uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value)), - uint64(s.c.freer), _UTF8) + uint64(ptr), uint64(len(value))) return s.c.error(r) } @@ -251,10 +279,9 @@ func (s *Stmt) BindBlob(param int, value []byte) error { return TOOBIG } ptr := s.c.newBytes(value) - r := s.c.call("sqlite3_bind_blob64", + r := s.c.call("sqlite3_bind_blob_go", uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(value)), - uint64(s.c.freer)) + uint64(ptr), uint64(len(value))) return s.c.error(r) } @@ -283,7 +310,8 @@ func (s *Stmt) BindNull(param int) error { // // https://sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindTime(param int, value time.Time, format TimeFormat) error { - if format == TimeFormatDefault { + switch format { + case TimeFormatDefault, TimeFormatAuto, time.RFC3339Nano: return s.bindRFC3339Nano(param, value) } switch v := format.Encode(value).(type) { @@ -306,10 +334,9 @@ func (s *Stmt) bindRFC3339Nano(param int, value time.Time) error { buf := util.View(s.c.mod, ptr, maxlen) buf = value.AppendFormat(buf[:0], time.RFC3339Nano) - r := s.c.call("sqlite3_bind_text64", + r := s.c.call("sqlite3_bind_text_go", uint64(s.handle), uint64(param), - uint64(ptr), uint64(len(buf)), - uint64(s.c.freer), _UTF8) + uint64(ptr), uint64(len(buf))) return s.c.error(r) } @@ -351,6 +378,15 @@ func (s *Stmt) BindValue(param int, value Value) error { return s.c.error(r) } +// DataCount resets the number of columns in a result set. +// +// https://sqlite.org/c3ref/data_count.html +func (s *Stmt) DataCount() int { + r := s.c.call("sqlite3_data_count", + uint64(s.handle)) + return int(int32(r)) +} + // ColumnCount returns the number of columns in a result set. // // https://sqlite.org/c3ref/column_count.html @@ -367,12 +403,10 @@ func (s *Stmt) ColumnCount() int { func (s *Stmt) ColumnName(col int) string { r := s.c.call("sqlite3_column_name", uint64(s.handle), uint64(col)) - - ptr := uint32(r) - if ptr == 0 { + if r == 0 { panic(util.OOMErr) } - return util.ReadString(s.c.mod, ptr, _MAX_NAME) + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) } // ColumnType returns the initial [Datatype] of the result column. @@ -398,15 +432,57 @@ func (s *Stmt) ColumnDeclType(col int) string { return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) } +// ColumnDatabaseName returns the name of the database +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnDatabaseName(col int) string { + r := s.c.call("sqlite3_column_database_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + +// ColumnTableName returns the name of the table +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnTableName(col int) string { + r := s.c.call("sqlite3_column_table_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + +// ColumnOriginName returns the name of the table column +// that is the origin of a particular result column. +// The leftmost column of the result set has the index 0. +// +// https://sqlite.org/c3ref/column_database_name.html +func (s *Stmt) ColumnOriginName(col int) string { + r := s.c.call("sqlite3_column_origin_name", + uint64(s.handle), uint64(col)) + if r == 0 { + return "" + } + return util.ReadString(s.c.mod, uint32(r), _MAX_NAME) +} + // ColumnBool returns the value of the result column as a bool. // The leftmost column of the result set has the index 0. // SQLite does not have a separate boolean storage class. -// Instead, boolean values are retrieved as integers, +// Instead, boolean values are retrieved as numbers, // with 0 converted to false and any other value to true. // // https://sqlite.org/c3ref/column_blob.html func (s *Stmt) ColumnBool(col int) bool { - return s.ColumnInt64(col) != 0 + return s.ColumnFloat(col) != 0 } // ColumnInt returns the value of the result column as an int. @@ -524,7 +600,7 @@ func (s *Stmt) ColumnJSON(col int, ptr any) error { var data []byte switch s.ColumnType(col) { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = s.ColumnRawText(col) case BLOB: @@ -565,7 +641,7 @@ func (s *Stmt) Columns(dest []any) error { defer s.c.arena.mark()() count := uint64(len(dest)) typePtr := s.c.arena.new(count) - dataPtr := s.c.arena.new(8 * count) + dataPtr := s.c.arena.new(count * 8) r := s.c.call("sqlite3_columns_go", uint64(s.handle), count, uint64(typePtr), uint64(dataPtr)) @@ -574,26 +650,31 @@ func (s *Stmt) Columns(dest []any) error { } types := util.View(s.c.mod, typePtr, count) + + // Avoid bounds checks on types below. + if len(types) != len(dest) { + panic(util.AssertErr()) + } + for i := range dest { switch types[i] { case byte(INTEGER): - dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr+8*uint32(i))) - continue + dest[i] = int64(util.ReadUint64(s.c.mod, dataPtr)) case byte(FLOAT): - dest[i] = util.ReadFloat64(s.c.mod, dataPtr+8*uint32(i)) - continue + dest[i] = util.ReadFloat64(s.c.mod, dataPtr) case byte(NULL): dest[i] = nil - continue - } - ptr := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+0) - len := util.ReadUint32(s.c.mod, dataPtr+8*uint32(i)+4) - buf := util.View(s.c.mod, ptr, uint64(len)) - if types[i] == byte(TEXT) { - dest[i] = string(buf) - } else { - dest[i] = buf + default: + ptr := util.ReadUint32(s.c.mod, dataPtr+0) + len := util.ReadUint32(s.c.mod, dataPtr+4) + buf := util.View(s.c.mod, ptr, uint64(len)) + if types[i] == byte(TEXT) { + dest[i] = string(buf) + } else { + dest[i] = buf + } } + dataPtr += 8 } return nil } diff --git a/vendor/github.com/ncruces/go-sqlite3/time.go b/vendor/github.com/ncruces/go-sqlite3/time.go index a14870ea54..d9c516c814 100644 --- a/vendor/github.com/ncruces/go-sqlite3/time.go +++ b/vendor/github.com/ncruces/go-sqlite3/time.go @@ -101,7 +101,7 @@ func (f TimeFormat) Encode(t time.Time) any { return t.UnixMicro() case TimeFormatUnixNano: return t.UnixNano() - // Special formats + // Special formats. case TimeFormatDefault, TimeFormatAuto: f = time.RFC3339Nano // SQLite assumes UTC if unspecified. @@ -138,8 +138,11 @@ func (f TimeFormat) Encode(t time.Time) any { // // https://sqlite.org/lang_datefunc.html func (f TimeFormat) Decode(v any) (time.Time, error) { + if t, ok := v.(time.Time); ok { + return t, nil + } switch f { - // Numeric formats + // Numeric formats. case TimeFormatJulianDay: switch v := v.(type) { case string: @@ -183,7 +186,7 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.UnixMilli(int64(math.Floor(v))).UTC(), nil case int64: - return time.UnixMilli(int64(v)).UTC(), nil + return time.UnixMilli(v).UTC(), nil default: return time.Time{}, util.TimeErr } @@ -200,7 +203,7 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.UnixMicro(int64(math.Floor(v))).UTC(), nil case int64: - return time.UnixMicro(int64(v)).UTC(), nil + return time.UnixMicro(v).UTC(), nil default: return time.Time{}, util.TimeErr } @@ -217,12 +220,12 @@ func (f TimeFormat) Decode(v any) (time.Time, error) { case float64: return time.Unix(0, int64(math.Floor(v))).UTC(), nil case int64: - return time.Unix(0, int64(v)).UTC(), nil + return time.Unix(0, v).UTC(), nil default: return time.Time{}, util.TimeErr } - // Special formats + // Special formats. case TimeFormatAuto: switch s := v.(type) { case string: diff --git a/vendor/github.com/ncruces/go-sqlite3/txn.go b/vendor/github.com/ncruces/go-sqlite3/txn.go index 0efbc2d800..57ba979aa9 100644 --- a/vendor/github.com/ncruces/go-sqlite3/txn.go +++ b/vendor/github.com/ncruces/go-sqlite3/txn.go @@ -3,14 +3,14 @@ package sqlite3 import ( "context" "errors" - "fmt" "math/rand" "runtime" "strconv" "strings" - "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" ) // Txn is an in-progress database transaction. @@ -32,6 +32,19 @@ func (c *Conn) Begin() Txn { return Txn{c} } +// BeginConcurrent starts a concurrent transaction. +// +// Experimental: requires a custom build of SQLite. +// +// https://sqlite.org/cgi/src/doc/begin-concurrent/doc/begin_concurrent.md +func (c *Conn) BeginConcurrent() (Txn, error) { + err := c.Exec(`BEGIN CONCURRENT`) + if err != nil { + return Txn{}, err + } + return Txn{c}, nil +} + // BeginImmediate starts an immediate transaction. // // https://sqlite.org/lang_transaction.html @@ -123,23 +136,21 @@ type Savepoint struct { // // https://sqlite.org/lang_savepoint.html func (c *Conn) Savepoint() Savepoint { - // Names can be reused; this makes catching bugs more likely. - name := saveptName() + "_" + strconv.Itoa(int(rand.Int31())) + name := callerName() + if name == "" { + name = "sqlite3.Savepoint" + } + // Names can be reused, but this makes catching bugs more likely. + name = QuoteIdentifier(name + "_" + strconv.Itoa(int(rand.Int31()))) - err := c.txnExecInterrupted(fmt.Sprintf("SAVEPOINT %q;", name)) + err := c.txnExecInterrupted(`SAVEPOINT ` + name) if err != nil { panic(err) } return Savepoint{c: c, name: name} } -func saveptName() (name string) { - defer func() { - if name == "" { - name = "sqlite3.Savepoint" - } - }() - +func callerName() (name string) { var pc [8]uintptr n := runtime.Callers(3, pc[:]) if n <= 0 { @@ -176,7 +187,7 @@ func (s Savepoint) Release(errp *error) { if s.c.GetAutocommit() { // There is nothing to commit. return } - *errp = s.c.Exec(fmt.Sprintf("RELEASE %q;", s.name)) + *errp = s.c.Exec(`RELEASE ` + s.name) if *errp == nil { return } @@ -188,10 +199,7 @@ func (s Savepoint) Release(errp *error) { return } // ROLLBACK and RELEASE even if interrupted. - err := s.c.txnExecInterrupted(fmt.Sprintf(` - ROLLBACK TO %[1]q; - RELEASE %[1]q; - `, s.name)) + err := s.c.txnExecInterrupted(`ROLLBACK TO ` + s.name + `; RELEASE ` + s.name) if err != nil { panic(err) } @@ -204,7 +212,7 @@ func (s Savepoint) Release(errp *error) { // https://sqlite.org/lang_transaction.html func (s Savepoint) Rollback() error { // ROLLBACK even if interrupted. - return s.c.txnExecInterrupted(fmt.Sprintf("ROLLBACK TO %q;", s.name)) + return s.c.txnExecInterrupted(`ROLLBACK TO ` + s.name) } func (c *Conn) txnExecInterrupted(sql string) error { @@ -217,7 +225,7 @@ func (c *Conn) txnExecInterrupted(sql string) error { return err } -// TxnState starts a deferred transaction. +// TxnState determines the transaction state of a database. // // https://sqlite.org/c3ref/txn_state.html func (c *Conn) TxnState(schema string) TxnState { @@ -292,3 +300,11 @@ func updateCallback(ctx context.Context, mod api.Module, pDB uint32, action Auth c.update(action, schema, table, int64(rowid)) } } + +// CacheFlush flushes caches to disk mid-transaction. +// +// https://sqlite.org/c3ref/db_cacheflush.html +func (c *Conn) CacheFlush() error { + r := c.call("sqlite3_db_cacheflush", uint64(c.handle)) + return c.error(r) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/util/osutil/open_windows.go b/vendor/github.com/ncruces/go-sqlite3/util/osutil/open_windows.go index 277f58bc3f..417faa5628 100644 --- a/vendor/github.com/ncruces/go-sqlite3/util/osutil/open_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/util/osutil/open_windows.go @@ -15,7 +15,7 @@ func OpenFile(name string, flag int, perm fs.FileMode) (*os.File, error) { if name == "" { return nil, &os.PathError{Op: "open", Path: name, Err: ENOENT} } - r, e := syscallOpen(name, flag, uint32(perm.Perm())) + r, e := syscallOpen(name, flag|O_CLOEXEC, uint32(perm.Perm())) if e != nil { return nil, &os.PathError{Op: "open", Path: name, Err: e} } diff --git a/vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go b/vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go index 7fbd04787c..83444e9063 100644 --- a/vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go +++ b/vendor/github.com/ncruces/go-sqlite3/util/osutil/osutil.go @@ -1,2 +1,2 @@ -// Package osutil implements operating system utility functions. +// Package osutil implements operating system utilities. package osutil diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md new file mode 100644 index 0000000000..9f47f5a9ff --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/README.md @@ -0,0 +1,9 @@ +# SQLite utility functions + +This package implements assorted SQLite utilities +useful to extension writers. + +It also wraps a [parser](https://github.com/marcobambini/sqlite-createtable-parser) +for the [`CREATE`](https://sqlite.org/lang_createtable.html) and +[`ALTER TABLE`](https://sqlite.org/lang_altertable.html) commands, +created by [Marco Bambini](https://github.com/marcobambini). \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go new file mode 100644 index 0000000000..3e8c728b09 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/arg.go @@ -0,0 +1,65 @@ +package sql3util + +import "strings" + +// NamedArg splits an named arg into a key and value, +// around an equals sign. +// Spaces are trimmed around both key and value. +func NamedArg(arg string) (key, val string) { + key, val, _ = strings.Cut(arg, "=") + key = strings.TrimSpace(key) + val = strings.TrimSpace(val) + return +} + +// Unquote unquotes a string. +// +// https://sqlite.org/lang_keywords.html +func Unquote(val string) string { + if len(val) < 2 { + return val + } + fst := val[0] + lst := val[len(val)-1] + rst := val[1 : len(val)-1] + if fst == '[' && lst == ']' { + return rst + } + if fst != lst { + return val + } + var old, new string + switch fst { + default: + return val + case '`': + old, new = "``", "`" + case '"': + old, new = `""`, `"` + case '\'': + old, new = `''`, `'` + } + return strings.ReplaceAll(rst, old, new) +} + +// ParseBool parses a boolean. +// +// https://sqlite.org/pragma.html#syntax +func ParseBool(s string) (b, ok bool) { + if len(s) == 0 { + return false, false + } + if s[0] == '0' { + return false, true + } + if '1' <= s[0] && s[0] <= '9' { + return true, true + } + switch strings.ToLower(s) { + case "true", "yes", "on": + return true, true + case "false", "no", "off": + return false, true + } + return false, false +} diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go new file mode 100644 index 0000000000..10e8af35a4 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/const.go @@ -0,0 +1,61 @@ +package sql3util + +const ( + _NONE = iota + _MEMORY + _SYNTAX + _UNSUPPORTEDSQL +) + +type ConflictClause uint32 + +const ( + CONFLICT_NONE ConflictClause = iota + CONFLICT_ROLLBACK + CONFLICT_ABORT + CONFLICT_FAIL + CONFLICT_IGNORE + CONFLICT_REPLACE +) + +type OrderClause uint32 + +const ( + ORDER_NONE OrderClause = iota + ORDER_ASC + ORDER_DESC +) + +type FKAction uint32 + +const ( + FKACTION_NONE FKAction = iota + FKACTION_SETNULL + FKACTION_SETDEFAULT + FKACTION_CASCADE + FKACTION_RESTRICT + FKACTION_NOACTION +) + +type FKDefType uint32 + +const ( + DEFTYPE_NONE FKDefType = iota + DEFTYPE_DEFERRABLE + DEFTYPE_DEFERRABLE_INITIALLY_DEFERRED + DEFTYPE_DEFERRABLE_INITIALLY_IMMEDIATE + DEFTYPE_NOTDEFERRABLE + DEFTYPE_NOTDEFERRABLE_INITIALLY_DEFERRED + DEFTYPE_NOTDEFERRABLE_INITIALLY_IMMEDIATE +) + +type StatementType uint32 + +const ( + CREATE_UNKNOWN StatementType = iota + CREATE_TABLE + ALTER_RENAME_TABLE + ALTER_RENAME_COLUMN + ALTER_ADD_COLUMN + ALTER_DROP_COLUMN +) diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go new file mode 100644 index 0000000000..7326f7dbb7 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse.go @@ -0,0 +1,210 @@ +package sql3util + +import ( + "context" + _ "embed" + "sync" + + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +const ( + errp = 4 + sqlp = 8 +) + +var ( + //go:embed parse/sql3parse_table.wasm + binary []byte + once sync.Once + runtime wazero.Runtime + compiled wazero.CompiledModule +) + +// ParseTable parses a [CREATE] or [ALTER TABLE] command. +// +// [CREATE]: https://sqlite.org/lang_createtable.html +// [ALTER TABLE]: https://sqlite.org/lang_altertable.html +func ParseTable(sql string) (_ *Table, err error) { + once.Do(func() { + ctx := context.Background() + cfg := wazero.NewRuntimeConfigInterpreter() + runtime = wazero.NewRuntimeWithConfig(ctx, cfg) + compiled, err = runtime.CompileModule(ctx, binary) + }) + if err != nil { + return nil, err + } + + ctx := context.Background() + mod, err := runtime.InstantiateModule(ctx, compiled, wazero.NewModuleConfig().WithName("")) + if err != nil { + return nil, err + } + defer mod.Close(ctx) + + if buf, ok := mod.Memory().Read(sqlp, uint32(len(sql))); ok { + copy(buf, sql) + } + + stack := [...]uint64{sqlp, uint64(len(sql)), errp} + err = mod.ExportedFunction("sql3parse_table").CallWithStack(ctx, stack[:]) + if err != nil { + return nil, err + } + + c, _ := mod.Memory().ReadUint32Le(errp) + switch c { + case _MEMORY: + panic(util.OOMErr) + case _SYNTAX: + return nil, util.ErrorString("sql3parse: invalid syntax") + case _UNSUPPORTEDSQL: + return nil, util.ErrorString("sql3parse: unsupported SQL") + } + + var tab Table + tab.load(mod, uint32(stack[0]), sql) + return &tab, nil +} + +// Table holds metadata about a table. +type Table struct { + Name string + Schema string + Comment string + IsTemporary bool + IsIfNotExists bool + IsWithoutRowID bool + IsStrict bool + Columns []Column + Type StatementType + CurrentName string + NewName string +} + +func (t *Table) load(mod api.Module, ptr uint32, sql string) { + t.Name = loadString(mod, ptr+0, sql) + t.Schema = loadString(mod, ptr+8, sql) + t.Comment = loadString(mod, ptr+16, sql) + + t.IsTemporary = loadBool(mod, ptr+24) + t.IsIfNotExists = loadBool(mod, ptr+25) + t.IsWithoutRowID = loadBool(mod, ptr+26) + t.IsStrict = loadBool(mod, ptr+27) + + t.Columns = loadSlice(mod, ptr+28, func(ptr uint32, res *Column) { + p, _ := mod.Memory().ReadUint32Le(ptr) + res.load(mod, p, sql) + }) + + t.Type = loadEnum[StatementType](mod, ptr+44) + t.CurrentName = loadString(mod, ptr+48, sql) + t.NewName = loadString(mod, ptr+56, sql) +} + +// Column holds metadata about a column. +type Column struct { + Name string + Type string + Length string + ConstraintName string + Comment string + IsPrimaryKey bool + IsAutoIncrement bool + IsNotNull bool + IsUnique bool + PKOrder OrderClause + PKConflictClause ConflictClause + NotNullConflictClause ConflictClause + UniqueConflictClause ConflictClause + CheckExpr string + DefaultExpr string + CollateName string + ForeignKeyClause *ForeignKey +} + +func (c *Column) load(mod api.Module, ptr uint32, sql string) { + c.Name = loadString(mod, ptr+0, sql) + c.Type = loadString(mod, ptr+8, sql) + c.Length = loadString(mod, ptr+16, sql) + c.ConstraintName = loadString(mod, ptr+24, sql) + c.Comment = loadString(mod, ptr+32, sql) + + c.IsPrimaryKey = loadBool(mod, ptr+40) + c.IsAutoIncrement = loadBool(mod, ptr+41) + c.IsNotNull = loadBool(mod, ptr+42) + c.IsUnique = loadBool(mod, ptr+43) + + c.PKOrder = loadEnum[OrderClause](mod, ptr+44) + c.PKConflictClause = loadEnum[ConflictClause](mod, ptr+48) + c.NotNullConflictClause = loadEnum[ConflictClause](mod, ptr+52) + c.UniqueConflictClause = loadEnum[ConflictClause](mod, ptr+56) + + c.CheckExpr = loadString(mod, ptr+60, sql) + c.DefaultExpr = loadString(mod, ptr+68, sql) + c.CollateName = loadString(mod, ptr+76, sql) + + if ptr, _ := mod.Memory().ReadUint32Le(ptr + 84); ptr != 0 { + c.ForeignKeyClause = &ForeignKey{} + c.ForeignKeyClause.load(mod, ptr, sql) + } +} + +type ForeignKey struct { + Table string + Columns []string + OnDelete FKAction + OnUpdate FKAction + Match string + Deferrable FKDefType +} + +func (f *ForeignKey) load(mod api.Module, ptr uint32, sql string) { + f.Table = loadString(mod, ptr+0, sql) + + f.Columns = loadSlice(mod, ptr+8, func(ptr uint32, res *string) { + *res = loadString(mod, ptr, sql) + }) + + f.OnDelete = loadEnum[FKAction](mod, ptr+16) + f.OnUpdate = loadEnum[FKAction](mod, ptr+20) + f.Match = loadString(mod, ptr+24, sql) + f.Deferrable = loadEnum[FKDefType](mod, ptr+32) +} + +func loadString(mod api.Module, ptr uint32, sql string) string { + off, _ := mod.Memory().ReadUint32Le(ptr + 0) + if off == 0 { + return "" + } + len, _ := mod.Memory().ReadUint32Le(ptr + 4) + return sql[off-sqlp : off+len-sqlp] +} + +func loadSlice[T any](mod api.Module, ptr uint32, fn func(uint32, *T)) []T { + ref, _ := mod.Memory().ReadUint32Le(ptr + 4) + if ref == 0 { + return nil + } + len, _ := mod.Memory().ReadUint32Le(ptr + 0) + res := make([]T, len) + for i := range res { + fn(ref, &res[i]) + ref += 4 + } + return res +} + +func loadEnum[T ~uint32](mod api.Module, ptr uint32) T { + val, _ := mod.Memory().ReadUint32Le(ptr) + return T(val) +} + +func loadBool(mod api.Module, ptr uint32) bool { + val, _ := mod.Memory().ReadByte(ptr) + return val != 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/parse/sql3parse_table.wasm new file mode 100644 index 0000000000000000000000000000000000000000..f0b3819c8ae33494e7d4653198efc809b6dd2297 GIT binary patch literal 17538 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 JYnxZs{|5?-)R6!H literal 0 HcmV?d00001 diff --git a/vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go new file mode 100644 index 0000000000..6be61927d9 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/util/sql3util/sql3util.go @@ -0,0 +1,9 @@ +// Package sql3util implements SQLite utilities. +package sql3util + +// ValidPageSize returns true if s is a valid page size. +// +// https://sqlite.org/fileformat.html#pages +func ValidPageSize(s int) bool { + return 512 <= s && s <= 65536 && s&(s-1) == 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/value.go b/vendor/github.com/ncruces/go-sqlite3/value.go index 61d3cbf709..86f6689da3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/value.go +++ b/vendor/github.com/ncruces/go-sqlite3/value.go @@ -68,12 +68,12 @@ func (v Value) NumericType() Datatype { // Bool returns the value as a bool. // SQLite does not have a separate boolean storage class. -// Instead, boolean values are retrieved as integers, +// Instead, boolean values are retrieved as numbers, // with 0 converted to false and any other value to true. // // https://sqlite.org/c3ref/value_blob.html func (v Value) Bool() bool { - return v.Int64() != 0 + return v.Float() != 0 } // Int returns the value as an int. @@ -177,7 +177,7 @@ func (v Value) JSON(ptr any) error { var data []byte switch v.Type() { case NULL: - data = append(data, "null"...) + data = []byte("null") case TEXT: data = v.RawText() case BLOB: @@ -201,6 +201,14 @@ func (v Value) NoChange() bool { return r != 0 } +// FromBind returns true if value originated from a bound parameter. +// +// https://sqlite.org/c3ref/value_blob.html +func (v Value) FromBind() bool { + r := v.c.call("sqlite3_value_frombind", v.protected()) + return r != 0 +} + // InFirst returns the first element // on the right-hand side of an IN constraint. // diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/README.md b/vendor/github.com/ncruces/go-sqlite3/vfs/README.md index 212ad6d335..cf0e3c30fc 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/README.md @@ -2,78 +2,115 @@ This package implements the SQLite [OS Interface](https://sqlite.org/vfs.html) (aka VFS). -It replaces the default SQLite VFS with a **pure Go** implementation. - -It also exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) -that should allow you to implement your own custom VFSes. +It replaces the default SQLite VFS with a **pure Go** implementation, +and exposes [interfaces](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#VFS) +that should allow you to implement your own [custom VFSes](#custom-vfses). Since it is a from scratch reimplementation, there are naturally some ways it deviates from the original. -The main differences are [file locking](#file-locking) and [WAL mode](write-ahead-logging) support. +The main differences are [file locking](#file-locking) and [WAL mode](#write-ahead-logging) support. ### File Locking POSIX advisory locks, which SQLite uses on Unix, are [broken by design](https://github.com/sqlite/sqlite/blob/b74eb0/src/os_unix.c#L1073-L1161). - -On Linux and macOS, this module uses +Instead, on Linux and macOS, this package uses [OFD locks](https://www.gnu.org/software/libc/manual/html_node/Open-File-Description-Locks.html) to synchronize access to database files. -OFD locks are fully compatible with POSIX advisory locks. -On BSD Unixes, this module uses -[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2). -On BSD, these locks are fully compatible with POSIX advisory locks. -However, concurrency is reduced with BSD locks -(`BEGIN IMMEDIATE` behaves the same as `BEGIN EXCLUSIVE`). +This package can also use +[BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2), +albeit with reduced concurrency (`BEGIN IMMEDIATE` behaves like `BEGIN EXCLUSIVE`). +BSD locks are the default on BSD and illumos, +but you can opt into them with the `sqlite3_flock` build tag. -On Windows, this module uses `LockFileEx` and `UnlockFileEx`, +On Windows, this package uses `LockFileEx` and `UnlockFileEx`, like SQLite. -On all other platforms, file locking is not supported, and you must use +You can also opt into a cross-platform locking implementation +with the `sqlite3_dotlk` build tag. +The only requirement is an atomic `os.Mkdir`. + +Otherwise, file locking is not supported, and you must use [`nolock=1`](https://sqlite.org/uri.html#urinolock) (or [`immutable=1`](https://sqlite.org/uri.html#uriimmutable)) -to open database files.\ +to open database files. To use the [`database/sql`](https://pkg.go.dev/database/sql) driver with `nolock=1` you must disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). You can use [`vfs.SupportsFileLocking`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#SupportsFileLocking) -to check if your platform supports file locking. +to check if your build supports file locking. ### Write-Ahead Logging -On 64-bit Linux and macOS, this module uses `mmap` to implement +On Unix, this package may use `mmap` to implement [shared-memory for the WAL-index](https://sqlite.org/wal.html#implementation_of_shared_memory_for_the_wal_index), like SQLite. -To allow `mmap` to work, each connection needs to reserve up to 4GB of address space.\ -To limit the amount of address space each connection needs, -use [`WithMemoryLimitPages`](../tests/testcfg/testcfg.go). +With [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2) +a WAL database can only be accessed by a single proccess. +Other processes that attempt to access a database locked with BSD locks, +will fail with the [`SQLITE_PROTOCOL`](https://sqlite.org/rescode.html#protocol) error code. + +On Windows, this package may use `MapViewOfFile`, like SQLite. + +You can also opt into a cross-platform, in-process, memory sharing implementation +with the `sqlite3_dotlk` build tag. -On Windows and BSD, [WAL](https://sqlite.org/wal.html) support is -[limited](https://sqlite.org/wal.html#noshm). -`EXCLUSIVE` locking mode can be set to create, read, and write WAL databases.\ +Otherwise, [WAL support is limited](https://sqlite.org/wal.html#noshm), +and `EXCLUSIVE` locking mode must be set to create, read, and write WAL databases. To use `EXCLUSIVE` locking mode with the [`database/sql`](https://pkg.go.dev/database/sql) driver you must disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). -On all other platforms, where file locking is not supported, WAL mode does not work. - You can use [`vfs.SupportsSharedMemory`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs#SupportsSharedMemory) -to check if your platform supports shared memory. +to check if your build supports shared memory. ### Batch-Atomic Write -On 64-bit Linux, this module supports [batch-atomic writes](https://sqlite.org/cgi/src/technote/714) -with the F2FS filesystem. +On Linux, this package may support +[batch-atomic writes](https://sqlite.org/cgi/src/technote/714) +on the F2FS filesystem. + +### Checksums + +This package can be [configured](https://pkg.go.dev/github.com/ncruces/go-sqlite3#Conn.EnableChecksums) +to add an 8-byte checksum to the end of every page in an SQLite database. +The checksum is added as each page is written +and verified as each page is read.\ +The checksum is intended to help detect database corruption +caused by random bit-flips in the mass storage device. + +The implementation is compatible with SQLite's +[Checksum VFS Shim](https://sqlite.org/cksumvfs.html). -### Build tags +### Build Tags The VFS can be customized with a few build tags: -- `sqlite3_flock` forces the use of BSD locks; it can be used on macOS to test the BSD locking implementation. -- `sqlite3_nosys` prevents importing [`x/sys`](https://pkg.go.dev/golang.org/x/sys); - disables locking _and_ shared memory on all platforms. -- `sqlite3_noshm` disables shared memory on all platforms. +- `sqlite3_flock` forces the use of BSD locks. +- `sqlite3_dotlk` forces the use of dot-file locks. +- `sqlite3_nosys` prevents importing [`x/sys`](https://pkg.go.dev/golang.org/x/sys). + +> [!IMPORTANT] +> The default configuration of this package is compatible with the standard +> [Unix and Windows SQLite VFSes](https://sqlite.org/vfs.html#multiple_vfses); +> `sqlite3_flock` builds are compatible with the +> [`unix-flock` VFS](https://sqlite.org/compile.html#enable_locking_style); +> `sqlite3_dotlk` builds are compatible with the +> [`unix-dotfile` VFS](https://sqlite.org/compile.html#enable_locking_style). +> If incompatible file locking is used, accessing databases concurrently with +> _other_ SQLite libraries will eventually corrupt data. + +### Custom VFSes + +- [`github.com/ncruces/go-sqlite3/vfs/memdb`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/memdb) + implements an in-memory VFS. +- [`github.com/ncruces/go-sqlite3/vfs/readervfs`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/readervfs) + implements a VFS for immutable databases. +- [`github.com/ncruces/go-sqlite3/vfs/adiantum`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/adiantum) + wraps a VFS to offer encryption at rest. +- [`github.com/ncruces/go-sqlite3/vfs/xts`](https://pkg.go.dev/github.com/ncruces/go-sqlite3/vfs/xts) + wraps a VFS to offer encryption at rest. diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index 19c22ae8fa..330e8a2b1f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -49,6 +49,13 @@ type File interface { DeviceCharacteristics() DeviceCharacteristic } +// FileUnwrap should be implemented by a File +// that wraps another File implementation. +type FileUnwrap interface { + File + Unwrap() File +} + // FileLockState extends File to implement the // SQLITE_FCNTL_LOCKSTATE file control opcode. // @@ -58,6 +65,26 @@ type FileLockState interface { LockState() LockLevel } +// FilePersistentWAL extends File to implement the +// SQLITE_FCNTL_PERSIST_WAL file control opcode. +// +// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal +type FilePersistentWAL interface { + File + PersistentWAL() bool + SetPersistentWAL(bool) +} + +// FilePowersafeOverwrite extends File to implement the +// SQLITE_FCNTL_POWERSAFE_OVERWRITE file control opcode. +// +// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpowersafeoverwrite +type FilePowersafeOverwrite interface { + File + PowersafeOverwrite() bool + SetPowersafeOverwrite(bool) +} + // FileChunkSize extends File to implement the // SQLITE_FCNTL_CHUNK_SIZE file control opcode. // @@ -94,26 +121,6 @@ type FileOverwrite interface { Overwrite() error } -// FilePersistentWAL extends File to implement the -// SQLITE_FCNTL_PERSIST_WAL file control opcode. -// -// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpersistwal -type FilePersistentWAL interface { - File - PersistentWAL() bool - SetPersistentWAL(bool) -} - -// FilePowersafeOverwrite extends File to implement the -// SQLITE_FCNTL_POWERSAFE_OVERWRITE file control opcode. -// -// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpowersafeoverwrite -type FilePowersafeOverwrite interface { - File - PowersafeOverwrite() bool - SetPowersafeOverwrite(bool) -} - // FileCommitPhaseTwo extends File to implement the // SQLITE_FCNTL_COMMIT_PHASETWO file control opcode. // @@ -135,15 +142,6 @@ type FileBatchAtomicWrite interface { RollbackAtomicWrite() error } -// FilePragma extends File to implement the -// SQLITE_FCNTL_PRAGMA file control opcode. -// -// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma -type FilePragma interface { - File - Pragma(name, value string) (string, error) -} - // FileCheckpoint extends File to implement the // SQLITE_FCNTL_CKPT_START and SQLITE_FCNTL_CKPT_DONE // file control opcodes. @@ -151,8 +149,17 @@ type FilePragma interface { // https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlckptstart type FileCheckpoint interface { File - CheckpointDone() error - CheckpointStart() error + CheckpointStart() + CheckpointDone() +} + +// FilePragma extends File to implement the +// SQLITE_FCNTL_PRAGMA file control opcode. +// +// https://sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlpragma +type FilePragma interface { + File + Pragma(name, value string) (string, error) } // FileSharedMemory extends File to possibly implement @@ -168,8 +175,19 @@ type FileSharedMemory interface { // SharedMemory is a shared-memory WAL-index implementation. // Use [NewSharedMemory] to create a shared-memory. type SharedMemory interface { - shmMap(context.Context, api.Module, int32, int32, bool) (uint32, error) - shmLock(int32, int32, _ShmFlag) error + shmMap(context.Context, api.Module, int32, int32, bool) (uint32, _ErrorCode) + shmLock(int32, int32, _ShmFlag) _ErrorCode shmUnmap(bool) + shmBarrier() io.Closer } + +type blockingSharedMemory interface { + SharedMemory + shmEnableBlocking(block bool) +} + +type fileControl interface { + File + fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go new file mode 100644 index 0000000000..900fa09522 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/cksm.go @@ -0,0 +1,149 @@ +package vfs + +import ( + "bytes" + "context" + _ "embed" + "encoding/binary" + "strconv" + + "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/ncruces/go-sqlite3/util/sql3util" +) + +func cksmWrapFile(name *Filename, flags OpenFlag, file File) File { + // Checksum only main databases and WALs. + if flags&(OPEN_MAIN_DB|OPEN_WAL) == 0 { + return file + } + + cksm := cksmFile{File: file} + + if flags&OPEN_WAL != 0 { + main, _ := name.DatabaseFile().(cksmFile) + cksm.cksmFlags = main.cksmFlags + } else { + cksm.cksmFlags = new(cksmFlags) + cksm.isDB = true + } + + return cksm +} + +type cksmFile struct { + File + *cksmFlags + isDB bool +} + +type cksmFlags struct { + computeCksm bool + verifyCksm bool + inCkpt bool + pageSize int +} + +func (c cksmFile) ReadAt(p []byte, off int64) (n int, err error) { + n, err = c.File.ReadAt(p, off) + + // SQLite is reading the header of a database file. + if c.isDB && off == 0 && len(p) >= 100 && + bytes.HasPrefix(p, []byte("SQLite format 3\000")) { + c.init(p) + } + + // Verify checksums. + if c.verifyCksm && !c.inCkpt && len(p) == c.pageSize { + cksm1 := cksmCompute(p[:len(p)-8]) + cksm2 := *(*[8]byte)(p[len(p)-8:]) + if cksm1 != cksm2 { + return 0, _IOERR_DATA + } + } + return n, err +} + +func (c cksmFile) WriteAt(p []byte, off int64) (n int, err error) { + // SQLite is writing the first page of a database file. + if c.isDB && off == 0 && len(p) >= 100 && + bytes.HasPrefix(p, []byte("SQLite format 3\000")) { + c.init(p) + } + + // Compute checksums. + if c.computeCksm && !c.inCkpt && len(p) == c.pageSize { + *(*[8]byte)(p[len(p)-8:]) = cksmCompute(p[:len(p)-8]) + } + + return c.File.WriteAt(p, off) +} + +func (c cksmFile) Pragma(name string, value string) (string, error) { + switch name { + case "checksum_verification": + b, ok := sql3util.ParseBool(value) + if ok { + c.verifyCksm = b && c.computeCksm + } + if !c.verifyCksm { + return "0", nil + } + return "1", nil + + case "page_size": + if c.computeCksm { + // Do not allow page size changes on a checksum database. + return strconv.Itoa(c.pageSize), nil + } + } + return "", _NOTFOUND +} + +func (c cksmFile) fileControl(ctx context.Context, mod api.Module, op _FcntlOpcode, pArg uint32) _ErrorCode { + switch op { + case _FCNTL_CKPT_START: + c.inCkpt = true + case _FCNTL_CKPT_DONE: + c.inCkpt = false + } + if rc := vfsFileControlImpl(ctx, mod, c, op, pArg); rc != _NOTFOUND { + return rc + } + return vfsFileControlImpl(ctx, mod, c.File, op, pArg) +} + +func (f *cksmFlags) init(header []byte) { + f.pageSize = 256 * int(binary.LittleEndian.Uint16(header[16:18])) + if r := header[20] == 8; r != f.computeCksm { + f.computeCksm = r + f.verifyCksm = r + } +} + +func cksmCompute(a []byte) (cksm [8]byte) { + var s1, s2 uint32 + for len(a) >= 8 { + s1 += binary.LittleEndian.Uint32(a[0:4]) + s2 + s2 += binary.LittleEndian.Uint32(a[4:8]) + s1 + a = a[8:] + } + if len(a) != 0 { + panic(util.AssertErr()) + } + binary.LittleEndian.PutUint32(cksm[0:4], s1) + binary.LittleEndian.PutUint32(cksm[4:8], s2) + return +} + +func (c cksmFile) SharedMemory() SharedMemory { + if f, ok := c.File.(FileSharedMemory); ok { + return f.SharedMemory() + } + return nil +} + +func (c cksmFile) Unwrap() File { + return c.File +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go index 7f409f35f4..0a8fee6211 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/const.go @@ -47,9 +47,12 @@ const ( _IOERR_SHMMAP _ErrorCode = util.IOERR_SHMMAP _IOERR_SEEK _ErrorCode = util.IOERR_SEEK _IOERR_DELETE_NOENT _ErrorCode = util.IOERR_DELETE_NOENT + _IOERR_GETTEMPPATH _ErrorCode = util.IOERR_GETTEMPPATH _IOERR_BEGIN_ATOMIC _ErrorCode = util.IOERR_BEGIN_ATOMIC _IOERR_COMMIT_ATOMIC _ErrorCode = util.IOERR_COMMIT_ATOMIC _IOERR_ROLLBACK_ATOMIC _ErrorCode = util.IOERR_ROLLBACK_ATOMIC + _IOERR_DATA _ErrorCode = util.IOERR_DATA + _BUSY_SNAPSHOT _ErrorCode = util.BUSY_SNAPSHOT _CANTOPEN_FULLPATH _ErrorCode = util.CANTOPEN_FULLPATH _CANTOPEN_ISDIR _ErrorCode = util.CANTOPEN_ISDIR _READONLY_CANTINIT _ErrorCode = util.READONLY_CANTINIT @@ -231,4 +234,8 @@ const ( _SHM_LOCK _ShmFlag = 2 _SHM_SHARED _ShmFlag = 4 _SHM_EXCLUSIVE _ShmFlag = 8 + + _SHM_NLOCK = 8 + _SHM_BASE = 120 + _SHM_DMS = _SHM_BASE + _SHM_NLOCK ) diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go index ca8cf84f3a..ba70aa14f7 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/file.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/file.go @@ -19,25 +19,26 @@ func (vfsOS) FullPathname(path string) (string, error) { if err != nil { return "", err } - fi, err := os.Lstat(path) + return path, testSymlinks(filepath.Dir(path)) +} + +func testSymlinks(path string) error { + p, err := filepath.EvalSymlinks(path) if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return path, nil - } - return "", err + return err } - if fi.Mode()&fs.ModeSymlink != 0 { - err = _OK_SYMLINK + if p != path { + return _OK_SYMLINK } - return path, err + return nil } func (vfsOS) Delete(path string, syncDir bool) error { err := os.Remove(path) + if errors.Is(err, fs.ErrNotExist) { + return _IOERR_DELETE_NOENT + } if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return _IOERR_DELETE_NOENT - } return err } if runtime.GOOS != "windows" && syncDir { @@ -69,11 +70,12 @@ func (vfsOS) Access(name string, flags AccessFlag) (bool, error) { } func (vfsOS) Open(name string, flags OpenFlag) (File, OpenFlag, error) { + // notest // OpenFilename is called instead return nil, 0, _CANTOPEN } func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error) { - var oflags int + oflags := _O_NOFOLLOW if flags&OPEN_EXCLUSIVE != 0 { oflags |= os.O_EXCL } @@ -95,6 +97,9 @@ func (vfsOS) OpenFilename(name *Filename, flags OpenFlag) (File, OpenFlag, error f, err = osutil.OpenFile(name.String(), oflags, 0666) } if err != nil { + if name == nil { + return nil, flags, _IOERR_GETTEMPPATH + } if errors.Is(err, syscall.EISDIR) { return nil, flags, _CANTOPEN_ISDIR } @@ -146,6 +151,7 @@ func (f *vfsFile) Close() error { if f.shm != nil { f.shm.Close() } + f.Unlock(LOCK_NONE) return f.File.Close() } @@ -201,10 +207,10 @@ func (f *vfsFile) HasMoved() (bool, error) { return false, err } pi, err := os.Stat(f.Name()) + if errors.Is(err, fs.ErrNotExist) { + return true, nil + } if err != nil { - if errors.Is(err, fs.ErrNotExist) { - return true, nil - } return false, err } return !os.SameFile(fi, pi), nil diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go b/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go index e23575bbb3..d9a29cd475 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/filename.go @@ -4,8 +4,9 @@ import ( "context" "net/url" - "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" ) // Filename is used by SQLite to pass filenames @@ -20,8 +21,8 @@ type Filename struct { stack [2]uint64 } -// OpenFilename is an internal API users should not call directly. -func OpenFilename(ctx context.Context, mod api.Module, id uint32, flags OpenFlag) *Filename { +// GetFilename is an internal API users should not call directly. +func GetFilename(ctx context.Context, mod api.Module, id uint32, flags OpenFlag) *Filename { if id == 0 { return nil } @@ -66,6 +67,10 @@ func (n *Filename) path(method string) string { if n == nil || n.zPath == 0 { return "" } + if n.flags&(OPEN_MAIN_DB|OPEN_MAIN_JOURNAL|OPEN_WAL) == 0 { + return "" + } + n.stack[0] = uint64(n.zPath) fn := n.mod.ExportedFunction(method) if err := fn.CallWithStack(n.ctx, n.stack[:]); err != nil { diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go b/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go index 57bc5f9065..22e320a813 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/lock.go @@ -1,4 +1,4 @@ -//go:build (linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys +//go:build ((linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys) || sqlite3_flock || sqlite3_dotlk package vfs @@ -75,20 +75,7 @@ func (f *vfsFile) Lock(lock LockLevel) error { if f.lock <= LOCK_NONE || f.lock >= LOCK_EXCLUSIVE { panic(util.AssertErr()) } - reserved := f.lock == LOCK_RESERVED - // A PENDING lock is needed before acquiring an EXCLUSIVE lock. - if f.lock < LOCK_PENDING { - // If we're already RESERVED, we can block indefinitely, - // since only new readers may briefly hold the PENDING lock. - if rc := osGetPendingLock(f.File, reserved /* block */); rc != _OK { - return rc - } - f.lock = LOCK_PENDING - } - // We already have PENDING, so we're just waiting for readers to leave. - // If we were RESERVED, we can wait for a little while, before invoking - // the busy handler; we will only do this once. - if rc := osGetExclusiveLock(f.File, reserved /* wait */); rc != _OK { + if rc := osGetExclusiveLock(f.File, &f.lock); rc != _OK { return rc } f.lock = LOCK_EXCLUSIVE diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go b/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go index a4563af484..81aacc622b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/lock_other.go @@ -1,4 +1,4 @@ -//go:build !(linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) || sqlite3_nosys +//go:build !(((linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys) || sqlite3_flock || sqlite3_dotlk) package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go index 48ac5c9c9d..56713e3591 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go @@ -1,33 +1,61 @@ -//go:build (freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && !sqlite3_nosys +//go:build ((freebsd || openbsd || netbsd || dragonfly || illumos) && !(sqlite3_dotlk || sqlite3_nosys)) || sqlite3_flock package vfs import ( "os" - "time" "golang.org/x/sys/unix" ) -func osUnlock(file *os.File, start, len int64) _ErrorCode { - if start == 0 && len == 0 { - err := unix.Flock(int(file.Fd()), unix.LOCK_UN) - if err != nil { - return _IOERR_UNLOCK - } +func osGetSharedLock(file *os.File) _ErrorCode { + return osLock(file, unix.LOCK_SH|unix.LOCK_NB, _IOERR_RDLOCK) +} + +func osGetReservedLock(file *os.File) _ErrorCode { + rc := osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK) + if rc == _BUSY { + // The documentation states the lock is upgraded by releasing the previous lock, + // then acquiring the new lock. + // This is a race, so return BUSY_SNAPSHOT to ensure the transaction is aborted. + return _BUSY_SNAPSHOT + } + return rc +} + +func osGetExclusiveLock(file *os.File, state *LockLevel) _ErrorCode { + if *state >= LOCK_RESERVED { + return _OK + } + return osGetReservedLock(file) +} + +func osDowngradeLock(file *os.File, _ LockLevel) _ErrorCode { + rc := osLock(file, unix.LOCK_SH|unix.LOCK_NB, _IOERR_RDLOCK) + if rc == _BUSY { + // The documentation states the lock is upgraded by releasing the previous lock, + // then acquiring the new lock. + // This is a race, so return IOERR_RDLOCK to ensure the transaction is aborted. + return _IOERR_RDLOCK } return _OK } -func osLock(file *os.File, how int, def _ErrorCode) _ErrorCode { - err := unix.Flock(int(file.Fd()), how) - return osLockErrorCode(err, def) +func osReleaseLock(file *os.File, _ LockLevel) _ErrorCode { + err := unix.Flock(int(file.Fd()), unix.LOCK_UN) + if err != nil { + return _IOERR_UNLOCK + } + return _OK } -func osReadLock(file *os.File, _ /*start*/, _ /*len*/ int64, _ /*timeout*/ time.Duration) _ErrorCode { - return osLock(file, unix.LOCK_SH|unix.LOCK_NB, _IOERR_RDLOCK) +func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { + // Test the RESERVED lock. + lock, rc := osTestLock(file, _RESERVED_BYTE, 1) + return lock == unix.F_WRLCK, rc } -func osWriteLock(file *os.File, _ /*start*/, _ /*len*/ int64, _ /*timeout*/ time.Duration) _ErrorCode { - return osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK) +func osLock(file *os.File, how int, def _ErrorCode) _ErrorCode { + err := unix.Flock(int(file.Fd()), how) + return osLockErrorCode(err, def) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go index 9826eb274e..c8d84dc36e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_darwin.go @@ -1,10 +1,11 @@ -//go:build !sqlite3_flock && !sqlite3_nosys +//go:build !(sqlite3_flock || sqlite3_nosys) package vfs import ( "io" "os" + "runtime" "time" "golang.org/x/sys/unix" @@ -68,7 +69,7 @@ func osUnlock(file *os.File, start, len int64) _ErrorCode { } func osLock(file *os.File, typ int16, start, len int64, timeout time.Duration, def _ErrorCode) _ErrorCode { - lock := flocktimeout_t{fl: unix.Flock_t{ + lock := &flocktimeout_t{fl: unix.Flock_t{ Type: typ, Start: start, Len: len, @@ -82,6 +83,7 @@ func osLock(file *os.File, typ int16, start, len int64, timeout time.Duration, d default: lock.timeout = unix.NsecToTimespec(int64(timeout / time.Nanosecond)) err = unix.FcntlFlock(file.Fd(), _F_OFD_SETLKWTIMEOUT, &lock.fl) + runtime.KeepAlive(lock) } return osLockErrorCode(err, def) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go new file mode 100644 index 0000000000..1c1a49c119 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_dotlk.go @@ -0,0 +1,143 @@ +//go:build sqlite3_dotlk + +package vfs + +import ( + "errors" + "io/fs" + "os" + "sync" +) + +var ( + // +checklocks:vfsDotLocksMtx + vfsDotLocks = map[string]*vfsDotLocker{} + vfsDotLocksMtx sync.Mutex +) + +type vfsDotLocker struct { + shared int // +checklocks:vfsDotLocksMtx + pending *os.File // +checklocks:vfsDotLocksMtx + reserved *os.File // +checklocks:vfsDotLocksMtx +} + +func osGetSharedLock(file *os.File) _ErrorCode { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + err := os.Mkdir(name+".lock", 0777) + if errors.Is(err, fs.ErrExist) { + return _BUSY // Another process has the lock. + } + if err != nil { + return _IOERR_LOCK + } + locker = &vfsDotLocker{} + vfsDotLocks[name] = locker + } + + if locker.pending != nil { + return _BUSY + } + locker.shared++ + return _OK +} + +func osGetReservedLock(file *os.File) _ErrorCode { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + return _IOERR_LOCK + } + + if locker.reserved != nil && locker.reserved != file { + return _BUSY + } + locker.reserved = file + return _OK +} + +func osGetExclusiveLock(file *os.File, _ *LockLevel) _ErrorCode { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + return _IOERR_LOCK + } + + if locker.pending != nil && locker.pending != file { + return _BUSY + } + locker.pending = file + if locker.shared > 1 { + return _BUSY + } + return _OK +} + +func osDowngradeLock(file *os.File, _ LockLevel) _ErrorCode { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + return _IOERR_UNLOCK + } + + if locker.reserved == file { + locker.reserved = nil + } + if locker.pending == file { + locker.pending = nil + } + return _OK +} + +func osReleaseLock(file *os.File, state LockLevel) _ErrorCode { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + return _IOERR_UNLOCK + } + + if locker.shared == 1 { + err := os.Remove(name + ".lock") + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return _IOERR_UNLOCK + } + delete(vfsDotLocks, name) + } + + if locker.reserved == file { + locker.reserved = nil + } + if locker.pending == file { + locker.pending = nil + } + locker.shared-- + return _OK +} + +func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { + vfsDotLocksMtx.Lock() + defer vfsDotLocksMtx.Unlock() + + name := file.Name() + locker := vfsDotLocks[name] + if locker == nil { + return false, _OK + } + return locker.reserved != nil, _OK +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go index a9f0e333c8..07bf0a0475 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_f2fs_linux.go @@ -9,13 +9,16 @@ import ( ) const ( + // https://godbolt.org/z/1PcK5vea3 _F2FS_IOC_START_ATOMIC_WRITE = 62721 _F2FS_IOC_COMMIT_ATOMIC_WRITE = 62722 _F2FS_IOC_ABORT_ATOMIC_WRITE = 62725 - _F2FS_IOC_GET_FEATURES = 2147808524 + _F2FS_IOC_GET_FEATURES = 2147808524 // -2147158772 _F2FS_FEATURE_ATOMIC_WRITE = 4 ) +// notest + func osBatchAtomic(file *os.File) bool { flags, err := unix.IoctlGetInt(int(file.Fd()), _F2FS_IOC_GET_FEATURES) return err == nil && flags&_F2FS_FEATURE_ATOMIC_WRITE != 0 diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go index 8a43f43921..e163e804d4 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_linux.go @@ -1,4 +1,4 @@ -//go:build !sqlite3_nosys +//go:build !(sqlite3_flock || sqlite3_nosys) package vfs @@ -53,10 +53,11 @@ func osLock(file *os.File, typ int16, start, len int64, timeout time.Duration, d if errno, _ := err.(unix.Errno); errno != unix.EAGAIN { break } - if timeout < time.Since(before) { + if time.Since(before) > timeout { break } - osSleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) + const sleepIncrement = 1024*1024 - 1 // power of two, ~1ms + time.Sleep(time.Duration(rand.Int63() & sleepIncrement)) } } return osLockErrorCode(err, def) diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go new file mode 100644 index 0000000000..b4f570f4de --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_ofd.go @@ -0,0 +1,59 @@ +//go:build (linux || darwin) && !(sqlite3_flock || sqlite3_dotlk || sqlite3_nosys) + +package vfs + +import ( + "os" + "time" + + "golang.org/x/sys/unix" +) + +func osGetSharedLock(file *os.File) _ErrorCode { + // Test the PENDING lock before acquiring a new SHARED lock. + if lock, _ := osTestLock(file, _PENDING_BYTE, 1); lock == unix.F_WRLCK { + return _BUSY + } + // Acquire the SHARED lock. + return osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) +} + +func osGetReservedLock(file *os.File) _ErrorCode { + // Acquire the RESERVED lock. + return osWriteLock(file, _RESERVED_BYTE, 1, 0) +} + +func osGetExclusiveLock(file *os.File, state *LockLevel) _ErrorCode { + if *state == LOCK_RESERVED { + // A PENDING lock is needed before acquiring an EXCLUSIVE lock. + if rc := osWriteLock(file, _PENDING_BYTE, 1, -1); rc != _OK { + return rc + } + *state = LOCK_PENDING + } + // Acquire the EXCLUSIVE lock. + return osWriteLock(file, _SHARED_FIRST, _SHARED_SIZE, time.Millisecond) +} + +func osDowngradeLock(file *os.File, state LockLevel) _ErrorCode { + if state >= LOCK_EXCLUSIVE { + // Downgrade to a SHARED lock. + if rc := osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0); rc != _OK { + // notest // this should never happen + return _IOERR_RDLOCK + } + } + // Release the PENDING and RESERVED locks. + return osUnlock(file, _PENDING_BYTE, 2) +} + +func osReleaseLock(file *os.File, _ LockLevel) _ErrorCode { + // Release all locks. + return osUnlock(file, 0, 0) +} + +func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { + // Test the RESERVED lock. + lock, rc := osTestLock(file, _RESERVED_BYTE, 1) + return lock == unix.F_WRLCK, rc +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_access.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_std.go similarity index 73% rename from vendor/github.com/ncruces/go-sqlite3/vfs/os_std_access.go rename to vendor/github.com/ncruces/go-sqlite3/vfs/os_std.go index 1621c0998b..87ce58b675 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_access.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_std.go @@ -7,6 +7,8 @@ import ( "os" ) +const _O_NOFOLLOW = 0 + func osAccess(path string, flags AccessFlag) error { fi, err := os.Stat(path) if err != nil { @@ -34,3 +36,12 @@ func osAccess(path string, flags AccessFlag) error { } return nil } + +func osSetMode(file *os.File, modeof string) error { + fi, err := os.Stat(modeof) + if err != nil { + return err + } + file.Chmod(fi.Mode()) + return nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_mode.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_mode.go deleted file mode 100644 index ac4904773b..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_mode.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !unix || sqlite3_nosys - -package vfs - -import "os" - -func osSetMode(file *os.File, modeof string) error { - fi, err := os.Stat(modeof) - if err != nil { - return err - } - file.Chmod(fi.Mode()) - return nil -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go deleted file mode 100644 index c6bc407694..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_std_sleep.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !windows || sqlite3_nosys - -package vfs - -import "time" - -func osSleep(d time.Duration) { - time.Sleep(d) -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go index bf4b44efd6..7a540889b5 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix.go @@ -9,6 +9,8 @@ import ( "golang.org/x/sys/unix" ) +const _O_NOFOLLOW = unix.O_NOFOLLOW + func osAccess(path string, flags AccessFlag) error { var access uint32 // unix.F_OK switch flags { @@ -31,3 +33,41 @@ func osSetMode(file *os.File, modeof string) error { } return nil } + +func osTestLock(file *os.File, start, len int64) (int16, _ErrorCode) { + lock := unix.Flock_t{ + Type: unix.F_WRLCK, + Start: start, + Len: len, + } + if unix.FcntlFlock(file.Fd(), unix.F_GETLK, &lock) != nil { + return 0, _IOERR_CHECKRESERVEDLOCK + } + return lock.Type, _OK +} + +func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { + if err == nil { + return _OK + } + if errno, ok := err.(unix.Errno); ok { + switch errno { + case + unix.EACCES, + unix.EAGAIN, + unix.EBUSY, + unix.EINTR, + unix.ENOLCK, + unix.EDEADLK, + unix.ETIMEDOUT: + return _BUSY + case unix.EPERM: + return _PERM + } + // notest // usually EWOULDBLOCK == EAGAIN + if errno == unix.EWOULDBLOCK && unix.EWOULDBLOCK != unix.EAGAIN { + return _BUSY + } + } + return def +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go deleted file mode 100644 index cdefa21ed7..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_unix_lock.go +++ /dev/null @@ -1,103 +0,0 @@ -//go:build (linux || darwin || freebsd || openbsd || netbsd || dragonfly || illumos) && !sqlite3_nosys - -package vfs - -import ( - "os" - "time" - - "golang.org/x/sys/unix" -) - -func osGetSharedLock(file *os.File) _ErrorCode { - // Test the PENDING lock before acquiring a new SHARED lock. - if lock, _ := osGetLock(file, _PENDING_BYTE, 1); lock == unix.F_WRLCK { - return _BUSY - } - // Acquire the SHARED lock. - return osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) -} - -func osGetReservedLock(file *os.File) _ErrorCode { - // Acquire the RESERVED lock. - return osWriteLock(file, _RESERVED_BYTE, 1, 0) -} - -func osGetPendingLock(file *os.File, block bool) _ErrorCode { - var timeout time.Duration - if block { - timeout = -1 - } - // Acquire the PENDING lock. - return osWriteLock(file, _PENDING_BYTE, 1, timeout) -} - -func osGetExclusiveLock(file *os.File, wait bool) _ErrorCode { - var timeout time.Duration - if wait { - timeout = time.Millisecond - } - // Acquire the EXCLUSIVE lock. - return osWriteLock(file, _SHARED_FIRST, _SHARED_SIZE, timeout) -} - -func osDowngradeLock(file *os.File, state LockLevel) _ErrorCode { - if state >= LOCK_EXCLUSIVE { - // Downgrade to a SHARED lock. - if rc := osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0); rc != _OK { - // In theory, the downgrade to a SHARED cannot fail because another - // process is holding an incompatible lock. If it does, this - // indicates that the other process is not following the locking - // protocol. If this happens, return _IOERR_RDLOCK. Returning - // BUSY would confuse the upper layer. - return _IOERR_RDLOCK - } - } - // Release the PENDING and RESERVED locks. - return osUnlock(file, _PENDING_BYTE, 2) -} - -func osReleaseLock(file *os.File, _ LockLevel) _ErrorCode { - // Release all locks. - return osUnlock(file, 0, 0) -} - -func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { - // Test the RESERVED lock. - lock, rc := osGetLock(file, _RESERVED_BYTE, 1) - return lock == unix.F_WRLCK, rc -} - -func osGetLock(file *os.File, start, len int64) (int16, _ErrorCode) { - lock := unix.Flock_t{ - Type: unix.F_WRLCK, - Start: start, - Len: len, - } - if unix.FcntlFlock(file.Fd(), unix.F_GETLK, &lock) != nil { - return 0, _IOERR_CHECKRESERVEDLOCK - } - return lock.Type, _OK -} - -func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { - if err == nil { - return _OK - } - if errno, ok := err.(unix.Errno); ok { - switch errno { - case - unix.EACCES, - unix.EAGAIN, - unix.EBUSY, - unix.EINTR, - unix.ENOLCK, - unix.EDEADLK, - unix.ETIMEDOUT: - return _BUSY - case unix.EPERM: - return _PERM - } - } - return def -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go index 5c68754f84..b901f98aa1 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go @@ -1,4 +1,4 @@ -//go:build !sqlite3_nosys +//go:build !(sqlite3_dotlk || sqlite3_nosys) package vfs @@ -28,27 +28,25 @@ func osGetReservedLock(file *os.File) _ErrorCode { return osWriteLock(file, _RESERVED_BYTE, 1, 0) } -func osGetPendingLock(file *os.File, block bool) _ErrorCode { - var timeout time.Duration - if block { - timeout = -1 - } - - // Acquire the PENDING lock. - return osWriteLock(file, _PENDING_BYTE, 1, timeout) -} - -func osGetExclusiveLock(file *os.File, wait bool) _ErrorCode { - var timeout time.Duration - if wait { - timeout = time.Millisecond +func osGetExclusiveLock(file *os.File, state *LockLevel) _ErrorCode { + // A PENDING lock is needed before releasing the SHARED lock. + if *state < LOCK_PENDING { + // If we were RESERVED, we can block indefinitely. + var timeout time.Duration + if *state == LOCK_RESERVED { + timeout = -1 + } + if rc := osWriteLock(file, _PENDING_BYTE, 1, timeout); rc != _OK { + return rc + } + *state = LOCK_PENDING } // Release the SHARED lock. osUnlock(file, _SHARED_FIRST, _SHARED_SIZE) // Acquire the EXCLUSIVE lock. - rc := osWriteLock(file, _SHARED_FIRST, _SHARED_SIZE, timeout) + rc := osWriteLock(file, _SHARED_FIRST, _SHARED_SIZE, time.Millisecond) if rc != _OK { // Reacquire the SHARED lock. @@ -64,8 +62,7 @@ func osDowngradeLock(file *os.File, state LockLevel) _ErrorCode { // Reacquire the SHARED lock. if rc := osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0); rc != _OK { - // This should never happen. - // We should always be able to reacquire the read lock. + // notest // this should never happen return _IOERR_RDLOCK } } @@ -133,10 +130,11 @@ func osLock(file *os.File, flags, start, len uint32, timeout time.Duration, def if errno, _ := err.(windows.Errno); errno != windows.ERROR_LOCK_VIOLATION { break } - if timeout < time.Since(before) { + if time.Since(before) > timeout { break } - osSleep(time.Duration(rand.Int63n(int64(time.Millisecond)))) + const sleepIncrement = 1024*1024 - 1 // power of two, ~1ms + time.Sleep(time.Duration(rand.Int63() & sleepIncrement)) } } return osLockErrorCode(err, def) @@ -171,16 +169,3 @@ func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } - -func osSleep(d time.Duration) { - if d > 0 { - period := max(1, d/(5*time.Millisecond)) - if period < 16 { - windows.TimeBeginPeriod(uint32(period)) - } - time.Sleep(d) - if period < 16 { - windows.TimeEndPeriod(uint32(period)) - } - } -} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go index 2b76dd5dcf..9d9dff1c40 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm.go @@ -1,17 +1,7 @@ -//go:build (darwin || linux) && (amd64 || arm64 || riscv64) && !(sqlite3_flock || sqlite3_noshm || sqlite3_nosys) +//go:build ((linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !sqlite3_nosys) || sqlite3_flock || sqlite3_dotlk package vfs -import ( - "context" - "io" - "os" - - "github.com/ncruces/go-sqlite3/internal/util" - "github.com/tetratelabs/wazero/api" - "golang.org/x/sys/unix" -) - // SupportsSharedMemory is false on platforms that do not support shared memory. // To use [WAL without shared-memory], you need to set [EXCLUSIVE locking mode]. // @@ -19,12 +9,6 @@ import ( // [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode const SupportsSharedMemory = true -const ( - _SHM_NLOCK = 8 - _SHM_BASE = 120 - _SHM_DMS = _SHM_BASE + _SHM_NLOCK -) - func (f *vfsFile) SharedMemory() SharedMemory { return f.shm } // NewSharedMemory returns a shared-memory WAL-index @@ -38,136 +22,5 @@ func NewSharedMemory(path string, flags OpenFlag) SharedMemory { if flags&OPEN_MAIN_DB == 0 || flags&(OPEN_DELETEONCLOSE|OPEN_MEMORY) != 0 { return nil } - return &vfsShm{ - path: path, - readOnly: flags&OPEN_READONLY != 0, - } -} - -type vfsShm struct { - *os.File - path string - regions []*util.MappedRegion - readOnly bool -} - -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, error) { - // Ensure size is a multiple of the OS page size. - if int(size)&(unix.Getpagesize()-1) != 0 { - return 0, _IOERR_SHMMAP - } - - if s.File == nil { - var flag int - if s.readOnly { - flag = unix.O_RDONLY - } else { - flag = unix.O_RDWR - } - f, err := os.OpenFile(s.path, - flag|unix.O_CREAT|unix.O_NOFOLLOW, 0666) - if err != nil { - return 0, _CANTOPEN - } - s.File = f - } - - // Dead man's switch. - if lock, rc := osGetLock(s.File, _SHM_DMS, 1); rc != _OK { - return 0, _IOERR_LOCK - } else if lock == unix.F_WRLCK { - return 0, _BUSY - } else if lock == unix.F_UNLCK { - if s.readOnly { - return 0, _READONLY_CANTINIT - } - if rc := osWriteLock(s.File, _SHM_DMS, 1, 0); rc != _OK { - return 0, rc - } - if err := s.Truncate(0); err != nil { - return 0, _IOERR_SHMOPEN - } - } - if rc := osReadLock(s.File, _SHM_DMS, 1, 0); rc != _OK { - return 0, rc - } - - // Check if file is big enough. - o, err := s.Seek(0, io.SeekEnd) - if err != nil { - return 0, _IOERR_SHMSIZE - } - if n := (int64(id) + 1) * int64(size); n > o { - if !extend { - return 0, nil - } - err := osAllocate(s.File, n) - if err != nil { - return 0, _IOERR_SHMSIZE - } - } - - var prot int - if s.readOnly { - prot = unix.PROT_READ - } else { - prot = unix.PROT_READ | unix.PROT_WRITE - } - r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, prot) - if err != nil { - return 0, err - } - s.regions = append(s.regions, r) - return r.Ptr, nil -} - -func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) error { - // Argument check. - if n <= 0 || offset < 0 || offset+n > _SHM_NLOCK { - panic(util.AssertErr()) - } - switch flags { - case - _SHM_LOCK | _SHM_SHARED, - _SHM_LOCK | _SHM_EXCLUSIVE, - _SHM_UNLOCK | _SHM_SHARED, - _SHM_UNLOCK | _SHM_EXCLUSIVE: - // - default: - panic(util.AssertErr()) - } - if n != 1 && flags&_SHM_EXCLUSIVE == 0 { - panic(util.AssertErr()) - } - - switch { - case flags&_SHM_UNLOCK != 0: - return osUnlock(s.File, _SHM_BASE+int64(offset), int64(n)) - case flags&_SHM_SHARED != 0: - return osReadLock(s.File, _SHM_BASE+int64(offset), int64(n), 0) - case flags&_SHM_EXCLUSIVE != 0: - return osWriteLock(s.File, _SHM_BASE+int64(offset), int64(n), 0) - default: - panic(util.AssertErr()) - } -} - -func (s *vfsShm) shmUnmap(delete bool) { - if s.File == nil { - return - } - - // Unmap regions. - for _, r := range s.regions { - r.Unmap() - } - clear(s.regions) - s.regions = s.regions[:0] - - // Close the file. - defer s.Close() - if delete { - os.Remove(s.Name()) - } - s.File = nil + return &vfsShm{path: path} } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go new file mode 100644 index 0000000000..d4e046369b --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go @@ -0,0 +1,231 @@ +//go:build ((freebsd || openbsd || netbsd || dragonfly || illumos) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_dotlk || sqlite3_nosys)) || sqlite3_flock + +package vfs + +import ( + "context" + "io" + "os" + "sync" + + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/unix" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +type vfsShmFile struct { + *os.File + info os.FileInfo + + refs int // +checklocks:vfsShmFilesMtx + + lock [_SHM_NLOCK]int16 // +checklocks:Mutex + sync.Mutex +} + +var ( + // +checklocks:vfsShmFilesMtx + vfsShmFiles []*vfsShmFile + vfsShmFilesMtx sync.Mutex +) + +type vfsShm struct { + *vfsShmFile + path string + lock [_SHM_NLOCK]bool + regions []*util.MappedRegion +} + +func (s *vfsShm) Close() error { + if s.vfsShmFile == nil { + return nil + } + + vfsShmFilesMtx.Lock() + defer vfsShmFilesMtx.Unlock() + + // Unlock everything. + s.shmLock(0, _SHM_NLOCK, _SHM_UNLOCK) + + // Decrease reference count. + if s.vfsShmFile.refs > 0 { + s.vfsShmFile.refs-- + s.vfsShmFile = nil + return nil + } + + err := s.File.Close() + for i, g := range vfsShmFiles { + if g == s.vfsShmFile { + vfsShmFiles[i] = nil + s.vfsShmFile = nil + return err + } + } + panic(util.AssertErr()) +} + +func (s *vfsShm) shmOpen() _ErrorCode { + if s.vfsShmFile != nil { + return _OK + } + + // Always open file read-write, as it will be shared. + f, err := os.OpenFile(s.path, + unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if err != nil { + return _CANTOPEN + } + // Closes file if it's not nil. + defer func() { f.Close() }() + + fi, err := f.Stat() + if err != nil { + return _IOERR_FSTAT + } + + vfsShmFilesMtx.Lock() + defer vfsShmFilesMtx.Unlock() + + // Find a shared file, increase the reference count. + for _, g := range vfsShmFiles { + if g != nil && os.SameFile(fi, g.info) { + s.vfsShmFile = g + g.refs++ + return _OK + } + } + + // Lock and truncate the file. + // The lock is only released by closing the file. + if rc := osLock(f, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK); rc != _OK { + return rc + } + if err := f.Truncate(0); err != nil { + return _IOERR_SHMOPEN + } + + // Add the new shared file. + s.vfsShmFile = &vfsShmFile{ + File: f, + info: fi, + } + f = nil // Don't close the file. + for i, g := range vfsShmFiles { + if g == nil { + vfsShmFiles[i] = s.vfsShmFile + return _OK + } + } + vfsShmFiles = append(vfsShmFiles, s.vfsShmFile) + return _OK +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + // Ensure size is a multiple of the OS page size. + if int(size)&(unix.Getpagesize()-1) != 0 { + return 0, _IOERR_SHMMAP + } + + if rc := s.shmOpen(); rc != _OK { + return 0, rc + } + + // Check if file is big enough. + o, err := s.Seek(0, io.SeekEnd) + if err != nil { + return 0, _IOERR_SHMSIZE + } + if n := (int64(id) + 1) * int64(size); n > o { + if !extend { + return 0, _OK + } + if osAllocate(s.File, n) != nil { + return 0, _IOERR_SHMSIZE + } + } + + r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, false) + if err != nil { + return 0, _IOERR_SHMMAP + } + s.regions = append(s.regions, r) + return r.Ptr, _OK +} + +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { + s.Lock() + defer s.Unlock() + + switch { + case flags&_SHM_UNLOCK != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + if s.vfsShmFile.lock[i] == 0 { + panic(util.AssertErr()) + } + if s.vfsShmFile.lock[i] <= 0 { + s.vfsShmFile.lock[i] = 0 + } else { + s.vfsShmFile.lock[i]-- + } + s.lock[i] = false + } + } + case flags&_SHM_SHARED != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } + if s.vfsShmFile.lock[i]+1 <= 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmFile.lock[i]++ + s.lock[i] = true + } + case flags&_SHM_EXCLUSIVE != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } + if s.vfsShmFile.lock[i] != 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmFile.lock[i] = -1 + s.lock[i] = true + } + default: + panic(util.AssertErr()) + } + + return _OK +} + +func (s *vfsShm) shmUnmap(delete bool) { + if s.vfsShmFile == nil { + return + } + + // Unmap regions. + for _, r := range s.regions { + r.Unmap() + } + s.regions = nil + + // Close the file. + if delete { + os.Remove(s.path) + } + s.Close() +} + +func (s *vfsShm) shmBarrier() { + s.Lock() + //lint:ignore SA2001 memory barrier. + s.Unlock() +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go new file mode 100644 index 0000000000..7a250523ef --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_copy.go @@ -0,0 +1,84 @@ +//go:build (windows && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !sqlite3_nosys) || sqlite3_dotlk + +package vfs + +import ( + "unsafe" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +const ( + _WALINDEX_HDR_SIZE = 136 + _WALINDEX_PGSZ = 32768 +) + +// This looks like a safe way of keeping the WAL-index in sync. +// +// The WAL-index file starts with a header, +// and the index doesn't meaningfully change if the header doesn't change. +// +// The header starts with two 48 byte, checksummed, copies of the same information, +// which are accessed independently between memory barriers. +// The checkpoint information that follows uses 4 byte aligned words. +// +// Finally, we have the WAL-index hash tables, +// which are only modified holding the exclusive WAL_WRITE_LOCK. +// +// Since all the data is either redundant+checksummed, +// 4 byte aligned, or modified under an exclusive lock, +// the copies below should correctly keep copies in sync. +// +// https://sqlite.org/walformat.html#the_wal_index_file_format + +func (s *vfsShm) shmAcquire() { + if len(s.ptrs) == 0 || shmUnmodified(s.shadow[0][:], s.shared[0][:]) { + return + } + // Copies modified words from shared to private memory. + for id, p := range s.ptrs { + shared := shmPage(s.shared[id][:]) + shadow := shmPage(s.shadow[id][:]) + privat := shmPage(util.View(s.mod, p, _WALINDEX_PGSZ)) + for i, shared := range shared { + if shadow[i] != shared { + shadow[i] = shared + privat[i] = shared + } + } + } +} + +func (s *vfsShm) shmRelease() { + if len(s.ptrs) == 0 || shmUnmodified(s.shadow[0][:], util.View(s.mod, s.ptrs[0], _WALINDEX_HDR_SIZE)) { + return + } + // Copies modified words from private to shared memory. + for id, p := range s.ptrs { + shared := shmPage(s.shared[id][:]) + shadow := shmPage(s.shadow[id][:]) + privat := shmPage(util.View(s.mod, p, _WALINDEX_PGSZ)) + for i, privat := range privat { + if shadow[i] != privat { + shadow[i] = privat + shared[i] = privat + } + } + } +} + +func (s *vfsShm) shmBarrier() { + s.Lock() + s.shmAcquire() + s.shmRelease() + s.Unlock() +} + +func shmPage(s []byte) *[_WALINDEX_PGSZ / 4]uint32 { + p := (*uint32)(unsafe.Pointer(unsafe.SliceData(s))) + return (*[_WALINDEX_PGSZ / 4]uint32)(unsafe.Slice(p, _WALINDEX_PGSZ/4)) +} + +func shmUnmodified(v1, v2 []byte) bool { + return *(*[_WALINDEX_HDR_SIZE]byte)(v1[:]) == *(*[_WALINDEX_HDR_SIZE]byte)(v2[:]) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go new file mode 100644 index 0000000000..36e00a1cd7 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_dotlk.go @@ -0,0 +1,224 @@ +//go:build sqlite3_dotlk + +package vfs + +import ( + "context" + "errors" + "io/fs" + "os" + "sync" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/tetratelabs/wazero/api" +) + +type vfsShmBuffer struct { + shared [][_WALINDEX_PGSZ]byte + refs int // +checklocks:vfsShmBuffersMtx + + lock [_SHM_NLOCK]int16 // +checklocks:Mutex + sync.Mutex +} + +var ( + // +checklocks:vfsShmBuffersMtx + vfsShmBuffers = map[string]*vfsShmBuffer{} + vfsShmBuffersMtx sync.Mutex +) + +type vfsShm struct { + *vfsShmBuffer + mod api.Module + alloc api.Function + free api.Function + path string + shadow [][_WALINDEX_PGSZ]byte + ptrs []uint32 + stack [1]uint64 + lock [_SHM_NLOCK]bool +} + +func (s *vfsShm) Close() error { + if s.vfsShmBuffer == nil { + return nil + } + + vfsShmBuffersMtx.Lock() + defer vfsShmBuffersMtx.Unlock() + + // Unlock everything. + s.shmLock(0, _SHM_NLOCK, _SHM_UNLOCK) + + // Decrease reference count. + if s.vfsShmBuffer.refs > 0 { + s.vfsShmBuffer.refs-- + s.vfsShmBuffer = nil + return nil + } + + err := os.Remove(s.path) + if err != nil && !errors.Is(err, fs.ErrNotExist) { + return _IOERR_UNLOCK + } + delete(vfsShmBuffers, s.path) + s.vfsShmBuffer = nil + return nil +} + +func (s *vfsShm) shmOpen() _ErrorCode { + if s.vfsShmBuffer != nil { + return _OK + } + + vfsShmBuffersMtx.Lock() + defer vfsShmBuffersMtx.Unlock() + + // Find a shared buffer, increase the reference count. + if g, ok := vfsShmBuffers[s.path]; ok { + s.vfsShmBuffer = g + g.refs++ + return _OK + } + + // Create a directory on disk to ensure only this process + // uses this path to register a shared memory. + err := os.Mkdir(s.path, 0777) + if errors.Is(err, fs.ErrExist) { + return _BUSY + } + if err != nil { + return _IOERR_LOCK + } + + // Add the new shared buffer. + s.vfsShmBuffer = &vfsShmBuffer{} + vfsShmBuffers[s.path] = s.vfsShmBuffer + return _OK +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + if size != _WALINDEX_PGSZ { + return 0, _IOERR_SHMMAP + } + if s.mod == nil { + s.mod = mod + s.free = mod.ExportedFunction("sqlite3_free") + s.alloc = mod.ExportedFunction("sqlite3_malloc64") + } + if rc := s.shmOpen(); rc != _OK { + return 0, rc + } + + s.Lock() + defer s.Unlock() + defer s.shmAcquire() + + // Extend shared memory. + if int(id) >= len(s.shared) { + if !extend { + return 0, _OK + } + s.shared = append(s.shared, make([][_WALINDEX_PGSZ]byte, int(id)-len(s.shared)+1)...) + } + + // Allocate shadow memory. + if int(id) >= len(s.shadow) { + s.shadow = append(s.shadow, make([][_WALINDEX_PGSZ]byte, int(id)-len(s.shadow)+1)...) + s.shadow[0][4] = 1 // force invalidation + } + + // Allocate local memory. + for int(id) >= len(s.ptrs) { + s.stack[0] = uint64(size) + if err := s.alloc.CallWithStack(ctx, s.stack[:]); err != nil { + panic(err) + } + if s.stack[0] == 0 { + panic(util.OOMErr) + } + clear(util.View(s.mod, uint32(s.stack[0]), _WALINDEX_PGSZ)) + s.ptrs = append(s.ptrs, uint32(s.stack[0])) + } + + return s.ptrs[id], _OK +} + +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { + s.Lock() + defer s.Unlock() + + switch { + case flags&_SHM_LOCK != 0: + defer s.shmAcquire() + case flags&_SHM_EXCLUSIVE != 0: + s.shmRelease() + } + + switch { + case flags&_SHM_UNLOCK != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + if s.vfsShmBuffer.lock[i] == 0 { + panic(util.AssertErr()) + } + if s.vfsShmBuffer.lock[i] <= 0 { + s.vfsShmBuffer.lock[i] = 0 + } else { + s.vfsShmBuffer.lock[i]-- + } + s.lock[i] = false + } + } + case flags&_SHM_SHARED != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } + if s.vfsShmBuffer.lock[i]+1 <= 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmBuffer.lock[i]++ + s.lock[i] = true + } + case flags&_SHM_EXCLUSIVE != 0: + for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } + if s.vfsShmBuffer.lock[i] != 0 { + return _BUSY + } + } + for i := offset; i < offset+n; i++ { + s.vfsShmBuffer.lock[i] = -1 + s.lock[i] = true + } + default: + panic(util.AssertErr()) + } + + return _OK +} + +func (s *vfsShm) shmUnmap(delete bool) { + if s.vfsShmBuffer == nil { + return + } + defer s.Close() + + s.Lock() + s.shmRelease() + defer s.Unlock() + + for _, p := range s.ptrs { + s.stack[0] = uint64(p) + if err := s.free.CallWithStack(context.Background(), s.stack[:]); err != nil { + panic(err) + } + } + s.ptrs = nil + s.shadow = nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go new file mode 100644 index 0000000000..75c8fbcfb0 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_ofd.go @@ -0,0 +1,168 @@ +//go:build (linux || darwin) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_flock || sqlite3_dotlk || sqlite3_nosys) + +package vfs + +import ( + "context" + "io" + "os" + "sync" + "time" + + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/unix" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +type vfsShm struct { + *os.File + path string + regions []*util.MappedRegion + readOnly bool + blocking bool + sync.Mutex +} + +var _ blockingSharedMemory = &vfsShm{} + +func (s *vfsShm) shmOpen() _ErrorCode { + if s.File == nil { + f, err := os.OpenFile(s.path, + unix.O_RDWR|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + if err != nil { + f, err = os.OpenFile(s.path, + unix.O_RDONLY|unix.O_CREAT|unix.O_NOFOLLOW, 0666) + s.readOnly = true + } + if err != nil { + return _CANTOPEN + } + s.File = f + } + + // Dead man's switch. + if lock, rc := osTestLock(s.File, _SHM_DMS, 1); rc != _OK { + return _IOERR_LOCK + } else if lock == unix.F_WRLCK { + return _BUSY + } else if lock == unix.F_UNLCK { + if s.readOnly { + return _READONLY_CANTINIT + } + // Do not use a blocking lock here. + // If the lock cannot be obtained immediately, + // it means some other connection is truncating the file. + // And after it has done so, it will not release its lock, + // but only downgrade it to a shared lock. + // So no point in blocking here. + // The call below to obtain the shared DMS lock may use a blocking lock. + if rc := osWriteLock(s.File, _SHM_DMS, 1, 0); rc != _OK { + return rc + } + if err := s.Truncate(0); err != nil { + return _IOERR_SHMOPEN + } + } + return osReadLock(s.File, _SHM_DMS, 1, time.Millisecond) +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + // Ensure size is a multiple of the OS page size. + if int(size)&(unix.Getpagesize()-1) != 0 { + return 0, _IOERR_SHMMAP + } + + if rc := s.shmOpen(); rc != _OK { + return 0, rc + } + + // Check if file is big enough. + o, err := s.Seek(0, io.SeekEnd) + if err != nil { + return 0, _IOERR_SHMSIZE + } + if n := (int64(id) + 1) * int64(size); n > o { + if !extend { + return 0, _OK + } + if s.readOnly || osAllocate(s.File, n) != nil { + return 0, _IOERR_SHMSIZE + } + } + + r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, s.readOnly) + if err != nil { + return 0, _IOERR_SHMMAP + } + s.regions = append(s.regions, r) + if s.readOnly { + return r.Ptr, _READONLY + } + return r.Ptr, _OK +} + +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { + // Argument check. + if n <= 0 || offset < 0 || offset+n > _SHM_NLOCK { + panic(util.AssertErr()) + } + switch flags { + case + _SHM_LOCK | _SHM_SHARED, + _SHM_LOCK | _SHM_EXCLUSIVE, + _SHM_UNLOCK | _SHM_SHARED, + _SHM_UNLOCK | _SHM_EXCLUSIVE: + // + default: + panic(util.AssertErr()) + } + if n != 1 && flags&_SHM_EXCLUSIVE == 0 { + panic(util.AssertErr()) + } + + var timeout time.Duration + if s.blocking { + timeout = time.Millisecond + } + + switch { + case flags&_SHM_UNLOCK != 0: + return osUnlock(s.File, _SHM_BASE+int64(offset), int64(n)) + case flags&_SHM_SHARED != 0: + return osReadLock(s.File, _SHM_BASE+int64(offset), int64(n), timeout) + case flags&_SHM_EXCLUSIVE != 0: + return osWriteLock(s.File, _SHM_BASE+int64(offset), int64(n), timeout) + default: + panic(util.AssertErr()) + } +} + +func (s *vfsShm) shmUnmap(delete bool) { + if s.File == nil { + return + } + + // Unmap regions. + for _, r := range s.regions { + r.Unmap() + } + s.regions = nil + + // Close the file. + if delete { + os.Remove(s.path) + } + s.Close() + s.File = nil +} + +func (s *vfsShm) shmBarrier() { + s.Lock() + //lint:ignore SA2001 memory barrier. + s.Unlock() +} + +func (s *vfsShm) shmEnableBlocking(block bool) { + s.blocking = block +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go index 21191979ec..9602dd0cd3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_other.go @@ -1,4 +1,4 @@ -//go:build !(darwin || linux) || !(amd64 || arm64 || riscv64) || sqlite3_flock || sqlite3_noshm || sqlite3_nosys +//go:build !(((linux || darwin || windows || freebsd || openbsd || netbsd || dragonfly || illumos) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !sqlite3_nosys) || sqlite3_flock || sqlite3_dotlk) package vfs diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go new file mode 100644 index 0000000000..218d8e2c73 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go @@ -0,0 +1,182 @@ +//go:build (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_dotlk || sqlite3_nosys) + +package vfs + +import ( + "context" + "io" + "os" + "sync" + "time" + + "github.com/tetratelabs/wazero/api" + "golang.org/x/sys/windows" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/ncruces/go-sqlite3/util/osutil" +) + +type vfsShm struct { + *os.File + mod api.Module + alloc api.Function + free api.Function + path string + regions []*util.MappedRegion + shared [][]byte + shadow [][_WALINDEX_PGSZ]byte + ptrs []uint32 + stack [1]uint64 + blocking bool + sync.Mutex +} + +var _ blockingSharedMemory = &vfsShm{} + +func (s *vfsShm) Close() error { + // Unmap regions. + for _, r := range s.regions { + r.Unmap() + } + s.regions = nil + + // Close the file. + return s.File.Close() +} + +func (s *vfsShm) shmOpen() _ErrorCode { + if s.File == nil { + f, err := osutil.OpenFile(s.path, os.O_RDWR|os.O_CREATE, 0666) + if err != nil { + return _CANTOPEN + } + s.File = f + } + + // Dead man's switch. + if rc := osWriteLock(s.File, _SHM_DMS, 1, 0); rc == _OK { + err := s.Truncate(0) + osUnlock(s.File, _SHM_DMS, 1) + if err != nil { + return _IOERR_SHMOPEN + } + } + return osReadLock(s.File, _SHM_DMS, 1, time.Millisecond) +} + +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { + // Ensure size is a multiple of the OS page size. + if size != _WALINDEX_PGSZ || (windows.Getpagesize()-1)&_WALINDEX_PGSZ != 0 { + return 0, _IOERR_SHMMAP + } + if s.mod == nil { + s.mod = mod + s.free = mod.ExportedFunction("sqlite3_free") + s.alloc = mod.ExportedFunction("sqlite3_malloc64") + } + if rc := s.shmOpen(); rc != _OK { + return 0, rc + } + + defer s.shmAcquire() + + // Check if file is big enough. + o, err := s.Seek(0, io.SeekEnd) + if err != nil { + return 0, _IOERR_SHMSIZE + } + if n := (int64(id) + 1) * int64(size); n > o { + if !extend { + return 0, _OK + } + if osAllocate(s.File, n) != nil { + return 0, _IOERR_SHMSIZE + } + } + + // Maps regions into memory. + for int(id) >= len(s.shared) { + r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size) + if err != nil { + return 0, _IOERR_SHMMAP + } + s.regions = append(s.regions, r) + s.shared = append(s.shared, r.Data) + } + + // Allocate shadow memory. + if int(id) >= len(s.shadow) { + s.shadow = append(s.shadow, make([][_WALINDEX_PGSZ]byte, int(id)-len(s.shadow)+1)...) + s.shadow[0][4] = 1 // force invalidation + } + + // Allocate local memory. + for int(id) >= len(s.ptrs) { + s.stack[0] = uint64(size) + if err := s.alloc.CallWithStack(ctx, s.stack[:]); err != nil { + panic(err) + } + if s.stack[0] == 0 { + panic(util.OOMErr) + } + clear(util.View(s.mod, uint32(s.stack[0]), _WALINDEX_PGSZ)) + s.ptrs = append(s.ptrs, uint32(s.stack[0])) + } + + return s.ptrs[id], _OK +} + +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { + switch { + case flags&_SHM_LOCK != 0: + defer s.shmAcquire() + case flags&_SHM_EXCLUSIVE != 0: + s.shmRelease() + } + + var timeout time.Duration + if s.blocking { + timeout = time.Millisecond + } + + switch { + case flags&_SHM_UNLOCK != 0: + return osUnlock(s.File, _SHM_BASE+uint32(offset), uint32(n)) + case flags&_SHM_SHARED != 0: + return osReadLock(s.File, _SHM_BASE+uint32(offset), uint32(n), timeout) + case flags&_SHM_EXCLUSIVE != 0: + return osWriteLock(s.File, _SHM_BASE+uint32(offset), uint32(n), timeout) + default: + panic(util.AssertErr()) + } +} + +func (s *vfsShm) shmUnmap(delete bool) { + if s.File == nil { + return + } + + s.shmRelease() + + // Free local memory. + for _, p := range s.ptrs { + s.stack[0] = uint64(p) + if err := s.free.CallWithStack(context.Background(), s.stack[:]); err != nil { + panic(err) + } + } + s.ptrs = nil + s.shadow = nil + s.shared = nil + + // Close the file. + s.Close() + s.File = nil + if delete { + os.Remove(s.path) + } +} + +func (s *vfsShm) shmEnableBlocking(block bool) { + s.blocking = block +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index 1887e9f221..83c95d08d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -5,13 +5,15 @@ import ( "crypto/rand" "io" "reflect" - "sync" + "strings" "time" - "github.com/ncruces/go-sqlite3/internal/util" - "github.com/ncruces/julianday" "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/ncruces/go-sqlite3/util/sql3util" + "github.com/ncruces/julianday" ) // ExportHostFunctions is an internal API users need not call directly. @@ -83,7 +85,7 @@ func vfsRandomness(ctx context.Context, mod api.Module, pVfs uint32, nByte int32 } func vfsSleep(ctx context.Context, mod api.Module, pVfs uint32, nMicro int32) _ErrorCode { - osSleep(time.Duration(nMicro) * time.Microsecond) + time.Sleep(time.Duration(nMicro) * time.Microsecond) return _OK } @@ -132,27 +134,21 @@ func vfsAccess(ctx context.Context, mod api.Module, pVfs, zPath uint32, flags Ac func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, flags OpenFlag, pOutFlags, pOutVFS uint32) _ErrorCode { vfs := vfsGet(mod, pVfs) - - var path string - if zPath != 0 { - path = util.ReadString(mod, zPath, _MAX_PATHNAME) - } + name := GetFilename(ctx, mod, zPath, flags) var file File var err error if ffs, ok := vfs.(VFSFilename); ok { - name := OpenFilename(ctx, mod, zPath, flags) file, flags, err = ffs.OpenFilename(name, flags) } else { - file, flags, err = vfs.Open(path, flags) + file, flags, err = vfs.Open(name.String(), flags) } if err != nil { return vfsErrorCode(err, _CANTOPEN) } if file, ok := file.(FilePowersafeOverwrite); ok { - name := OpenFilename(ctx, mod, zPath, flags) - if b, ok := util.ParseBool(name.URIParameter("psow")); ok { + if b, ok := sql3util.ParseBool(name.URIParameter("psow")); ok { file.SetPowersafeOverwrite(b) } } @@ -163,16 +159,14 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } + file = cksmWrapFile(name, flags, file) vfsFileRegister(ctx, mod, pFile, file) return _OK } func vfsClose(ctx context.Context, mod api.Module, pFile uint32) _ErrorCode { err := vfsFileClose(ctx, mod, pFile) - if err != nil { - return vfsErrorCode(err, _IOERR_CLOSE) - } - return _OK + return vfsErrorCode(err, _IOERR_CLOSE) } func vfsRead(ctx context.Context, mod api.Module, pFile, zBuf uint32, iAmt int32, iOfst int64) _ErrorCode { @@ -195,10 +189,7 @@ func vfsWrite(ctx context.Context, mod api.Module, pFile, zBuf uint32, iAmt int3 buf := util.View(mod, zBuf, uint64(iAmt)) _, err := file.WriteAt(buf, iOfst) - if err != nil { - return vfsErrorCode(err, _IOERR_WRITE) - } - return _OK + return vfsErrorCode(err, _IOERR_WRITE) } func vfsTruncate(ctx context.Context, mod api.Module, pFile uint32, nByte int64) _ErrorCode { @@ -247,12 +238,20 @@ func vfsCheckReservedLock(ctx context.Context, mod api.Module, pFile, pResOut ui func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _FcntlOpcode, pArg uint32) _ErrorCode { file := vfsFileGet(ctx, mod, pFile).(File) + if file, ok := file.(fileControl); ok { + return file.fileControl(ctx, mod, op, pArg) + } + return vfsFileControlImpl(ctx, mod, file, op, pArg) +} +func vfsFileControlImpl(ctx context.Context, mod api.Module, file File, op _FcntlOpcode, pArg uint32) _ErrorCode { switch op { case _FCNTL_LOCKSTATE: if file, ok := file.(FileLockState); ok { - util.WriteUint32(mod, pArg, uint32(file.LockState())) - return _OK + if lk := file.LockState(); lk <= LOCK_EXCLUSIVE { + util.WriteUint32(mod, pArg, uint32(lk)) + return _OK + } } case _FCNTL_PERSIST_WAL: @@ -332,15 +331,15 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl return vfsErrorCode(err, _IOERR_ROLLBACK_ATOMIC) } - case _FCNTL_CKPT_DONE: + case _FCNTL_CKPT_START: if file, ok := file.(FileCheckpoint); ok { - err := file.CheckpointDone() - return vfsErrorCode(err, _IOERR) + file.CheckpointStart() + return _OK } - case _FCNTL_CKPT_START: + case _FCNTL_CKPT_DONE: if file, ok := file.(FileCheckpoint); ok { - err := file.CheckpointStart() - return vfsErrorCode(err, _IOERR) + file.CheckpointDone() + return _OK } case _FCNTL_PRAGMA: @@ -352,14 +351,14 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl value = util.ReadString(mod, ptr, _MAX_SQL_LENGTH) } - out, err := file.Pragma(name, value) + out, err := file.Pragma(strings.ToLower(name), value) ret := vfsErrorCode(err, _ERROR) if ret == _ERROR { out = err.Error() } if out != "" { - fn := mod.ExportedFunction("malloc") + fn := mod.ExportedFunction("sqlite3_malloc64") stack := [...]uint64{uint64(len(out) + 1)} if err := fn.CallWithStack(ctx, stack[:]); err != nil { panic(err) @@ -369,6 +368,14 @@ func vfsFileControl(ctx context.Context, mod api.Module, pFile uint32, op _Fcntl } return ret } + + case _FCNTL_LOCK_TIMEOUT: + if file, ok := file.(FileSharedMemory); ok { + if shm, ok := file.SharedMemory().(blockingSharedMemory); ok { + shm.shmEnableBlocking(util.ReadUint32(mod, pArg) != 0) + return _OK + } + } } // Consider also implementing these opcodes (in use by SQLite): @@ -388,27 +395,21 @@ func vfsDeviceCharacteristics(ctx context.Context, mod api.Module, pFile uint32) return file.DeviceCharacteristics() } -var shmBarrier sync.Mutex - func vfsShmBarrier(ctx context.Context, mod api.Module, pFile uint32) { - shmBarrier.Lock() - defer shmBarrier.Unlock() + shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() + shm.shmBarrier() } func vfsShmMap(ctx context.Context, mod api.Module, pFile uint32, iRegion, szRegion int32, bExtend, pp uint32) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() - p, err := shm.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) - if err != nil { - return vfsErrorCode(err, _IOERR_SHMMAP) - } + p, rc := shm.shmMap(ctx, mod, iRegion, szRegion, bExtend != 0) util.WriteUint32(mod, pp, p) - return _OK + return rc } func vfsShmLock(ctx context.Context, mod api.Module, pFile uint32, offset, n int32, flags _ShmFlag) _ErrorCode { shm := vfsFileGet(ctx, mod, pFile).(FileSharedMemory).SharedMemory() - err := shm.shmLock(offset, n, flags) - return vfsErrorCode(err, _IOERR_SHMLOCK) + return shm.shmLock(offset, n, flags) } func vfsShmUnmap(ctx context.Context, mod api.Module, pFile, bDelete uint32) _ErrorCode { diff --git a/vendor/github.com/ncruces/go-sqlite3/vtab.go b/vendor/github.com/ncruces/go-sqlite3/vtab.go index a330c98ffb..9834862304 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vtab.go +++ b/vendor/github.com/ncruces/go-sqlite3/vtab.go @@ -4,8 +4,9 @@ import ( "context" "reflect" - "github.com/ncruces/go-sqlite3/internal/util" "github.com/tetratelabs/wazero/api" + + "github.com/ncruces/go-sqlite3/internal/util" ) // CreateModule registers a new virtual table module name. @@ -16,14 +17,15 @@ func CreateModule[T VTab](db *Conn, name string, create, connect VTabConstructor var flags int const ( - VTAB_CREATOR = 0x01 - VTAB_DESTROYER = 0x02 - VTAB_UPDATER = 0x04 - VTAB_RENAMER = 0x08 - VTAB_OVERLOADER = 0x10 - VTAB_CHECKER = 0x20 - VTAB_TXN = 0x40 - VTAB_SAVEPOINTER = 0x80 + VTAB_CREATOR = 0x001 + VTAB_DESTROYER = 0x002 + VTAB_UPDATER = 0x004 + VTAB_RENAMER = 0x008 + VTAB_OVERLOADER = 0x010 + VTAB_CHECKER = 0x020 + VTAB_TXN = 0x040 + VTAB_SAVEPOINTER = 0x080 + VTAB_SHADOWTABS = 0x100 ) if create != nil { @@ -52,10 +54,16 @@ func CreateModule[T VTab](db *Conn, name string, create, connect VTabConstructor if implements[VTabSavepointer](vtab) { flags |= VTAB_SAVEPOINTER } + if implements[VTabShadowTabler](vtab) { + flags |= VTAB_SHADOWTABS + } + var modulePtr uint32 defer db.arena.mark()() namePtr := db.arena.string(name) - modulePtr := util.AddHandle(db.ctx, module[T]{create, connect}) + if connect != nil { + modulePtr = util.AddHandle(db.ctx, module[T]{create, connect}) + } r := db.call("sqlite3_create_module_go", uint64(db.handle), uint64(namePtr), uint64(flags), uint64(modulePtr)) return db.error(r) @@ -174,6 +182,17 @@ type VTabOverloader interface { FindFunction(arg int, name string) (ScalarFunction, IndexConstraintOp) } +// A VTabShadowTabler allows a virtual table to protect the content +// of shadow tables from being corrupted by hostile SQL. +// +// Implementing this interface signals that a virtual table named +// "mumble" reserves all table names starting with "mumble_". +type VTabShadowTabler interface { + VTab + // https://sqlite.org/vtab.html#the_xshadowname_method + ShadowTables() +} + // A VTabChecker allows a virtual table to report errors // to the PRAGMA integrity_check and PRAGMA quick_check commands. // @@ -232,7 +251,7 @@ type VTabCursor interface { // https://sqlite.org/vtab.html#xeof EOF() bool // https://sqlite.org/vtab.html#xcolumn - Column(ctx *Context, n int) error + Column(ctx Context, n int) error // https://sqlite.org/vtab.html#xrowid RowID() (int64, error) } @@ -337,8 +356,9 @@ func (idx *IndexInfo) load() { idx.OrderBy = make([]IndexOrderBy, util.ReadUint32(mod, ptr+8)) constraintPtr := util.ReadUint32(mod, ptr+4) + constraint := idx.Constraint for i := range idx.Constraint { - idx.Constraint[i] = IndexConstraint{ + constraint[i] = IndexConstraint{ Column: int(int32(util.ReadUint32(mod, constraintPtr+0))), Op: IndexConstraintOp(util.ReadUint8(mod, constraintPtr+4)), Usable: util.ReadUint8(mod, constraintPtr+5) != 0, @@ -347,8 +367,9 @@ func (idx *IndexInfo) load() { } orderByPtr := util.ReadUint32(mod, ptr+12) - for i := range idx.OrderBy { - idx.OrderBy[i] = IndexOrderBy{ + orderBy := idx.OrderBy + for i := range orderBy { + orderBy[i] = IndexOrderBy{ Column: int(int32(util.ReadUint32(mod, orderByPtr+0))), Desc: util.ReadUint8(mod, orderByPtr+4) != 0, } @@ -603,7 +624,7 @@ func cursorNextCallback(ctx context.Context, mod api.Module, pCur uint32) uint32 func cursorColumnCallback(ctx context.Context, mod api.Module, pCur, pCtx uint32, n int32) uint32 { cursor := vtabGetHandle(ctx, mod, pCur).(VTabCursor) db := ctx.Value(connKey{}).(*Conn) - err := cursor.Column(&Context{db, pCtx}, int(n)) + err := cursor.Column(Context{db, pCtx}, int(n)) return vtabError(ctx, mod, pCur, _CURSOR_ERROR, err) } diff --git a/vendor/github.com/tetratelabs/wazero/experimental/memory.go b/vendor/github.com/tetratelabs/wazero/experimental/memory.go index e379bf0538..26540648ba 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/memory.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/memory.go @@ -35,6 +35,8 @@ type LinearMemory interface { // Notes: // - To back a shared memory, Reallocate can't change the address of the // backing []byte (only its length/capacity may change). + // - Reallocate may return nil if fails to grow the LinearMemory. This + // condition may or may not be handled gracefully by the Wasm module. Reallocate(size uint64) []byte // Free the backing memory buffer. Free() diff --git a/vendor/github.com/tetratelabs/wazero/internal/descriptor/table.go b/vendor/github.com/tetratelabs/wazero/internal/descriptor/table.go index 03761e6ec4..a20e19100a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/descriptor/table.go +++ b/vendor/github.com/tetratelabs/wazero/internal/descriptor/table.go @@ -1,6 +1,9 @@ package descriptor -import "math/bits" +import ( + "math/bits" + "slices" +) // Table is a data structure mapping 32 bit descriptor to items. // @@ -37,23 +40,13 @@ func (t *Table[Key, Item]) Len() (n int) { return n } -// grow ensures that t has enough room for n items, potentially reallocating the -// internal buffers if their capacity was too small to hold this many items. +// grow grows the table by n * 64 items. func (t *Table[Key, Item]) grow(n int) { - // Round up to a multiple of 64 since this is the smallest increment due to - // using 64 bits masks. - n = (n*64 + 63) / 64 + total := len(t.masks) + n + t.masks = slices.Grow(t.masks, n)[:total] - if n > len(t.masks) { - masks := make([]uint64, n) - copy(masks, t.masks) - - items := make([]Item, n*64) - copy(items, t.items) - - t.masks = masks - t.items = items - } + total = len(t.items) + n*64 + t.items = slices.Grow(t.items, n*64)[:total] } // Insert inserts the given item to the table, returning the key that it is @@ -78,13 +71,9 @@ insert: } } + // No free slot found, grow the table and retry. offset = len(t.masks) - n := 2 * len(t.masks) - if n == 0 { - n = 1 - } - - t.grow(n) + t.grow(1) goto insert } @@ -109,10 +98,10 @@ func (t *Table[Key, Item]) InsertAt(item Item, key Key) bool { if key < 0 { return false } - if diff := int(key) - t.Len(); diff > 0 { + index := uint(key) / 64 + if diff := int(index) - len(t.masks) + 1; diff > 0 { t.grow(diff) } - index := uint(key) / 64 shift := uint(key) % 64 t.masks[index] |= 1 << shift t.items[key] = item @@ -124,7 +113,8 @@ func (t *Table[Key, Item]) Delete(key Key) { if key < 0 { // invalid key return } - if index, shift := key/64, key%64; int(index) < len(t.masks) { + if index := uint(key) / 64; int(index) < len(t.masks) { + shift := uint(key) % 64 mask := t.masks[index] if (mask & (1 << shift)) != 0 { var zero Item diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go b/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go index ee0b453ca0..5b5e6e9d08 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/interpreter/interpreter.go @@ -487,7 +487,7 @@ func (e *engine) setLabelAddress(op *uint64, label label, labelAddressResolution } // ResolveImportedFunction implements wasm.ModuleEngine. -func (e *moduleEngine) ResolveImportedFunction(index, indexInImportedModule wasm.Index, importedModuleEngine wasm.ModuleEngine) { +func (e *moduleEngine) ResolveImportedFunction(index, descFunc, indexInImportedModule wasm.Index, importedModuleEngine wasm.ModuleEngine) { imported := importedModuleEngine.(*moduleEngine) e.functions[index] = imported.functions[indexInImportedModule] } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/module_engine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/module_engine.go index efa1b9bbaa..8811feed71 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/module_engine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/wazevo/module_engine.go @@ -237,7 +237,7 @@ func (m *moduleEngine) putLocalMemory() { } // ResolveImportedFunction implements wasm.ModuleEngine. -func (m *moduleEngine) ResolveImportedFunction(index, indexInImportedModule wasm.Index, importedModuleEngine wasm.ModuleEngine) { +func (m *moduleEngine) ResolveImportedFunction(index, descFunc, indexInImportedModule wasm.Index, importedModuleEngine wasm.ModuleEngine) { executableOffset, moduleCtxOffset, typeIDOffset := m.parent.offsets.ImportedFunctionOffset(index) importedME := importedModuleEngine.(*moduleEngine) @@ -245,12 +245,12 @@ func (m *moduleEngine) ResolveImportedFunction(index, indexInImportedModule wasm indexInImportedModule -= wasm.Index(len(importedME.importedFunctions)) } else { imported := &importedME.importedFunctions[indexInImportedModule] - m.ResolveImportedFunction(index, imported.indexInModule, imported.me) + m.ResolveImportedFunction(index, descFunc, imported.indexInModule, imported.me) return // Recursively resolve the imported function. } offset := importedME.parent.functionOffsets[indexInImportedModule] - typeID := getTypeIDOf(indexInImportedModule, importedME.module) + typeID := m.module.TypeIDs[descFunc] executable := &importedME.parent.executable[offset] // Write functionInstance. binary.LittleEndian.PutUint64(m.opaque[executableOffset:], uint64(uintptr(unsafe.Pointer(executable)))) @@ -261,28 +261,6 @@ func (m *moduleEngine) ResolveImportedFunction(index, indexInImportedModule wasm m.importedFunctions[index] = importedFunction{me: importedME, indexInModule: indexInImportedModule} } -func getTypeIDOf(funcIndex wasm.Index, m *wasm.ModuleInstance) wasm.FunctionTypeID { - source := m.Source - - var typeIndex wasm.Index - if funcIndex >= source.ImportFunctionCount { - funcIndex -= source.ImportFunctionCount - typeIndex = source.FunctionSection[funcIndex] - } else { - var cnt wasm.Index - for i := range source.ImportSection { - if source.ImportSection[i].Type == wasm.ExternTypeFunc { - if cnt == funcIndex { - typeIndex = source.ImportSection[i].DescFunc - break - } - cnt++ - } - } - } - return m.TypeIDs[typeIndex] -} - // ResolveImportedMemory implements wasm.ModuleEngine. func (m *moduleEngine) ResolveImportedMemory(importedModuleEngine wasm.ModuleEngine) { importedME := importedModuleEngine.(*moduleEngine) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs_supported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs_supported.go index ff93415b9c..a949bd54dc 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs_supported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs_supported.go @@ -5,6 +5,7 @@ package sysfs import ( "io/fs" "os" + "path" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) @@ -34,6 +35,11 @@ func (d *dirFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { // Symlink implements the same method as documented on sys.FS func (d *dirFS) Symlink(oldName, link string) experimentalsys.Errno { + // Creating a symlink with an absolute path string fails with a "not permitted" error. + // https://github.com/WebAssembly/wasi-filesystem/blob/v0.2.0/path-resolution.md#symlinks + if path.IsAbs(oldName) { + return experimentalsys.EPERM + } // Note: do not resolve `oldName` relative to this dirFS. The link result is always resolved // when dereference the `link` on its usage (e.g. readlink, read, etc). // https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go index fdbf1fde0d..1b6d5f3dec 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go @@ -269,7 +269,7 @@ func (f *fsFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experim if f.reopenDir { // re-open the directory if needed. f.reopenDir = false - if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { + if errno = adjustReaddirErr(f, f.closed, f.rewindDir()); errno != 0 { return } } @@ -418,19 +418,25 @@ func seek(s io.Seeker, offset int64, whence int) (int64, experimentalsys.Errno) return newOffset, experimentalsys.UnwrapOSError(err) } -// reopenFile allows re-opening a file for reasons such as applying flags or -// directory iteration. -type reopenFile func() experimentalsys.Errno - -// compile-time check to ensure fsFile.reopen implements reopenFile. -var _ reopenFile = (*fsFile)(nil).reopen - -// reopen implements the same method as documented on reopenFile. -func (f *fsFile) reopen() experimentalsys.Errno { - _ = f.close() - var err error - f.file, err = f.fs.Open(f.name) - return experimentalsys.UnwrapOSError(err) +func (f *fsFile) rewindDir() experimentalsys.Errno { + // Reopen the directory to rewind it. + file, err := f.fs.Open(f.name) + if err != nil { + return experimentalsys.UnwrapOSError(err) + } + fi, err := file.Stat() + if err != nil { + return experimentalsys.UnwrapOSError(err) + } + // Can't check if it's still the same file, + // but is it still a directory, at least? + if !fi.IsDir() { + return experimentalsys.ENOTDIR + } + // Only update f on success. + _ = f.file.Close() + f.file = file + return 0 } // readdirFile allows masking the `Readdir` function on os.File. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go index 490f0fa681..a9b01eb6a9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go @@ -83,21 +83,12 @@ func (f *osFile) SetAppend(enable bool) (errno experimentalsys.Errno) { f.flag &= ^experimentalsys.O_APPEND } - // Clear any create or trunc flag, as we are re-opening, not re-creating. - f.flag &= ^(experimentalsys.O_CREAT | experimentalsys.O_TRUNC) - - // appendMode (bool) cannot be changed later, so we have to re-open the - // file. https://github.com/golang/go/blob/go1.20/src/os/file_unix.go#L60 + // appendMode cannot be changed later, so we have to re-open the file + // https://github.com/golang/go/blob/go1.23/src/os/file_unix.go#L60 return fileError(f, f.closed, f.reopen()) } -// compile-time check to ensure osFile.reopen implements reopenFile. -var _ reopenFile = (*osFile)(nil).reopen - func (f *osFile) reopen() (errno experimentalsys.Errno) { - // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^experimentalsys.O_CREAT - var ( isDir bool offset int64 @@ -116,22 +107,47 @@ func (f *osFile) reopen() (errno experimentalsys.Errno) { } } - _ = f.close() - f.file, errno = OpenFile(f.path, f.flag, f.perm) + // Clear any create or trunc flag, as we are re-opening, not re-creating. + flag := f.flag &^ (experimentalsys.O_CREAT | experimentalsys.O_TRUNC) + file, errno := OpenFile(f.path, flag, f.perm) + if errno != 0 { + return errno + } + errno = f.checkSameFile(file) if errno != 0 { return errno } if !isDir { - _, err = f.file.Seek(offset, io.SeekStart) + _, err = file.Seek(offset, io.SeekStart) if err != nil { + _ = file.Close() return experimentalsys.UnwrapOSError(err) } } + // Only update f on success. + _ = f.file.Close() + f.file = file + f.fd = file.Fd() return 0 } +func (f *osFile) checkSameFile(osf *os.File) experimentalsys.Errno { + fi1, err := f.file.Stat() + if err != nil { + return experimentalsys.UnwrapOSError(err) + } + fi2, err := osf.Stat() + if err != nil { + return experimentalsys.UnwrapOSError(err) + } + if os.SameFile(fi1, fi2) { + return 0 + } + return experimentalsys.ENOENT +} + // IsNonblock implements the same method as documented on fsapi.File func (f *osFile) IsNonblock() bool { return isNonblock(f) diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/engine.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/engine.go index 61a342ef23..8c387e9e12 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/engine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/engine.go @@ -44,9 +44,10 @@ type ModuleEngine interface { // ResolveImportedFunction is used to add imported functions needed to make this ModuleEngine fully functional. // - `index` is the function Index of this imported function. + // - `descFunc` is the type Index in Module.TypeSection of this imported function. It corresponds to Import.DescFunc. // - `indexInImportedModule` is the function Index of the imported function in the imported module. // - `importedModuleEngine` is the ModuleEngine for the imported ModuleInstance. - ResolveImportedFunction(index, indexInImportedModule Index, importedModuleEngine ModuleEngine) + ResolveImportedFunction(index, descFunc, indexInImportedModule Index, importedModuleEngine ModuleEngine) // ResolveImportedMemory is called when this module imports a memory from another module. ResolveImportedMemory(importedModuleEngine ModuleEngine) diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go index 8e072fd127..9a1f0c6d1d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/memory.go @@ -77,6 +77,7 @@ func NewMemoryInstance(memSec *Memory, allocator experimental.MemoryAllocator, m if allocator != nil { expBuffer = allocator.Allocate(capBytes, maxBytes) buffer = expBuffer.Reallocate(minBytes) + _ = buffer[:minBytes] // Bounds check that the minimum was allocated. } else if memSec.IsShared { // Shared memory needs a fixed buffer, so allocate with the maximum size. // @@ -238,12 +239,15 @@ func (m *MemoryInstance) Grow(delta uint32) (result uint32, ok bool) { return currentPages, true } - // If exceeds the max of memory size, we push -1 according to the spec. newPages := currentPages + delta if newPages > m.Max || int32(delta) < 0 { return 0, false } else if m.expBuffer != nil { buffer := m.expBuffer.Reallocate(MemoryPagesToBytesNum(newPages)) + if buffer == nil { + // Allocator failed to grow. + return 0, false + } if m.Shared { if unsafe.SliceData(buffer) != unsafe.SliceData(m.Buffer) { panic("shared memory cannot move, this is a bug in the memory allocator") diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go index dda6e5b635..c7909c67c1 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go @@ -446,7 +446,7 @@ func (m *ModuleInstance) resolveImports(ctx context.Context, module *Module) (er return } - m.Engine.ResolveImportedFunction(i.IndexPerType, imported.Index, importedModule.Engine) + m.Engine.ResolveImportedFunction(i.IndexPerType, i.DescFunc, imported.Index, importedModule.Engine) case ExternTypeTable: expected := i.DescTable importedTable := importedModule.Tables[imported.Index] diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat.go b/vendor/github.com/tetratelabs/wazero/sys/stat.go index bb7b9e5d33..3288855453 100644 --- a/vendor/github.com/tetratelabs/wazero/sys/stat.go +++ b/vendor/github.com/tetratelabs/wazero/sys/stat.go @@ -29,9 +29,7 @@ type EpochNanos = int64 // # Notes // // - This is used for WebAssembly ABI emulating the POSIX `stat` system call. -// Fields included are required for WebAssembly ABI including wasip1 -// (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). See -// https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html +// See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html // - Fields here are required for WebAssembly ABI including wasip1 // (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). // - This isn't the same as syscall.Stat_t because wazero supports Windows, diff --git a/vendor/golang.org/x/crypto/LICENSE b/vendor/golang.org/x/crypto/LICENSE index 6a66aea5ea..2a7cf70da6 100644 --- a/vendor/golang.org/x/crypto/LICENSE +++ b/vendor/golang.org/x/crypto/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s index 6713accac0..c3895478ed 100644 --- a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s +++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s @@ -1,243 +1,2791 @@ -// Copyright 2017 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run blamka_amd64.go -out ../blamka_amd64.s -pkg argon2. DO NOT EDIT. //go:build amd64 && gc && !purego #include "textflag.h" -DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 - -DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 - -#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v6, t1; \ - PUNPCKLQDQ v6, t2; \ - PUNPCKHQDQ v7, v6; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ v7, t2; \ - MOVO t1, v7; \ - MOVO v2, t1; \ - PUNPCKHQDQ t2, v7; \ - PUNPCKLQDQ v3, t2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v3 - -#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v2, t1; \ - PUNPCKLQDQ v2, t2; \ - PUNPCKHQDQ v3, v2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ v3, t2; \ - MOVO t1, v3; \ - MOVO v6, t1; \ - PUNPCKHQDQ t2, v3; \ - PUNPCKLQDQ v7, t2; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v7 - -#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, t0, c40, c48) \ - MOVO v0, t0; \ - PMULULQ v2, t0; \ - PADDQ v2, v0; \ - PADDQ t0, v0; \ - PADDQ t0, v0; \ - PXOR v0, v6; \ - PSHUFD $0xB1, v6, v6; \ - MOVO v4, t0; \ - PMULULQ v6, t0; \ - PADDQ v6, v4; \ - PADDQ t0, v4; \ - PADDQ t0, v4; \ - PXOR v4, v2; \ - PSHUFB c40, v2; \ - MOVO v0, t0; \ - PMULULQ v2, t0; \ - PADDQ v2, v0; \ - PADDQ t0, v0; \ - PADDQ t0, v0; \ - PXOR v0, v6; \ - PSHUFB c48, v6; \ - MOVO v4, t0; \ - PMULULQ v6, t0; \ - PADDQ v6, v4; \ - PADDQ t0, v4; \ - PADDQ t0, v4; \ - PXOR v4, v2; \ - MOVO v2, t0; \ - PADDQ v2, t0; \ - PSRLQ $63, v2; \ - PXOR t0, v2; \ - MOVO v1, t0; \ - PMULULQ v3, t0; \ - PADDQ v3, v1; \ - PADDQ t0, v1; \ - PADDQ t0, v1; \ - PXOR v1, v7; \ - PSHUFD $0xB1, v7, v7; \ - MOVO v5, t0; \ - PMULULQ v7, t0; \ - PADDQ v7, v5; \ - PADDQ t0, v5; \ - PADDQ t0, v5; \ - PXOR v5, v3; \ - PSHUFB c40, v3; \ - MOVO v1, t0; \ - PMULULQ v3, t0; \ - PADDQ v3, v1; \ - PADDQ t0, v1; \ - PADDQ t0, v1; \ - PXOR v1, v7; \ - PSHUFB c48, v7; \ - MOVO v5, t0; \ - PMULULQ v7, t0; \ - PADDQ v7, v5; \ - PADDQ t0, v5; \ - PADDQ t0, v5; \ - PXOR v5, v3; \ - MOVO v3, t0; \ - PADDQ v3, t0; \ - PSRLQ $63, v3; \ - PXOR t0, v3 - -#define LOAD_MSG_0(block, off) \ - MOVOU 8*(off+0)(block), X0; \ - MOVOU 8*(off+2)(block), X1; \ - MOVOU 8*(off+4)(block), X2; \ - MOVOU 8*(off+6)(block), X3; \ - MOVOU 8*(off+8)(block), X4; \ - MOVOU 8*(off+10)(block), X5; \ - MOVOU 8*(off+12)(block), X6; \ - MOVOU 8*(off+14)(block), X7 - -#define STORE_MSG_0(block, off) \ - MOVOU X0, 8*(off+0)(block); \ - MOVOU X1, 8*(off+2)(block); \ - MOVOU X2, 8*(off+4)(block); \ - MOVOU X3, 8*(off+6)(block); \ - MOVOU X4, 8*(off+8)(block); \ - MOVOU X5, 8*(off+10)(block); \ - MOVOU X6, 8*(off+12)(block); \ - MOVOU X7, 8*(off+14)(block) - -#define LOAD_MSG_1(block, off) \ - MOVOU 8*off+0*8(block), X0; \ - MOVOU 8*off+16*8(block), X1; \ - MOVOU 8*off+32*8(block), X2; \ - MOVOU 8*off+48*8(block), X3; \ - MOVOU 8*off+64*8(block), X4; \ - MOVOU 8*off+80*8(block), X5; \ - MOVOU 8*off+96*8(block), X6; \ - MOVOU 8*off+112*8(block), X7 - -#define STORE_MSG_1(block, off) \ - MOVOU X0, 8*off+0*8(block); \ - MOVOU X1, 8*off+16*8(block); \ - MOVOU X2, 8*off+32*8(block); \ - MOVOU X3, 8*off+48*8(block); \ - MOVOU X4, 8*off+64*8(block); \ - MOVOU X5, 8*off+80*8(block); \ - MOVOU X6, 8*off+96*8(block); \ - MOVOU X7, 8*off+112*8(block) - -#define BLAMKA_ROUND_0(block, off, t0, t1, c40, c48) \ - LOAD_MSG_0(block, off); \ - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ - SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \ - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \ - STORE_MSG_0(block, off) - -#define BLAMKA_ROUND_1(block, off, t0, t1, c40, c48) \ - LOAD_MSG_1(block, off); \ - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ - SHUFFLE(X2, X3, X4, X5, X6, X7, t0, t1); \ - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, t0, c40, c48); \ - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, t0, t1); \ - STORE_MSG_1(block, off) - // func blamkaSSE4(b *block) -TEXT ·blamkaSSE4(SB), 4, $0-8 - MOVQ b+0(FP), AX - - MOVOU ·c40<>(SB), X10 - MOVOU ·c48<>(SB), X11 +// Requires: SSE2, SSSE3 +TEXT ·blamkaSSE4(SB), NOSPLIT, $0-8 + MOVQ b+0(FP), AX + MOVOU ·c40<>+0(SB), X10 + MOVOU ·c48<>+0(SB), X11 + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU 32(AX), X2 + MOVOU 48(AX), X3 + MOVOU 64(AX), X4 + MOVOU 80(AX), X5 + MOVOU 96(AX), X6 + MOVOU 112(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, (AX) + MOVOU X1, 16(AX) + MOVOU X2, 32(AX) + MOVOU X3, 48(AX) + MOVOU X4, 64(AX) + MOVOU X5, 80(AX) + MOVOU X6, 96(AX) + MOVOU X7, 112(AX) + MOVOU 128(AX), X0 + MOVOU 144(AX), X1 + MOVOU 160(AX), X2 + MOVOU 176(AX), X3 + MOVOU 192(AX), X4 + MOVOU 208(AX), X5 + MOVOU 224(AX), X6 + MOVOU 240(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 128(AX) + MOVOU X1, 144(AX) + MOVOU X2, 160(AX) + MOVOU X3, 176(AX) + MOVOU X4, 192(AX) + MOVOU X5, 208(AX) + MOVOU X6, 224(AX) + MOVOU X7, 240(AX) + MOVOU 256(AX), X0 + MOVOU 272(AX), X1 + MOVOU 288(AX), X2 + MOVOU 304(AX), X3 + MOVOU 320(AX), X4 + MOVOU 336(AX), X5 + MOVOU 352(AX), X6 + MOVOU 368(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 256(AX) + MOVOU X1, 272(AX) + MOVOU X2, 288(AX) + MOVOU X3, 304(AX) + MOVOU X4, 320(AX) + MOVOU X5, 336(AX) + MOVOU X6, 352(AX) + MOVOU X7, 368(AX) + MOVOU 384(AX), X0 + MOVOU 400(AX), X1 + MOVOU 416(AX), X2 + MOVOU 432(AX), X3 + MOVOU 448(AX), X4 + MOVOU 464(AX), X5 + MOVOU 480(AX), X6 + MOVOU 496(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 384(AX) + MOVOU X1, 400(AX) + MOVOU X2, 416(AX) + MOVOU X3, 432(AX) + MOVOU X4, 448(AX) + MOVOU X5, 464(AX) + MOVOU X6, 480(AX) + MOVOU X7, 496(AX) + MOVOU 512(AX), X0 + MOVOU 528(AX), X1 + MOVOU 544(AX), X2 + MOVOU 560(AX), X3 + MOVOU 576(AX), X4 + MOVOU 592(AX), X5 + MOVOU 608(AX), X6 + MOVOU 624(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 512(AX) + MOVOU X1, 528(AX) + MOVOU X2, 544(AX) + MOVOU X3, 560(AX) + MOVOU X4, 576(AX) + MOVOU X5, 592(AX) + MOVOU X6, 608(AX) + MOVOU X7, 624(AX) + MOVOU 640(AX), X0 + MOVOU 656(AX), X1 + MOVOU 672(AX), X2 + MOVOU 688(AX), X3 + MOVOU 704(AX), X4 + MOVOU 720(AX), X5 + MOVOU 736(AX), X6 + MOVOU 752(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 640(AX) + MOVOU X1, 656(AX) + MOVOU X2, 672(AX) + MOVOU X3, 688(AX) + MOVOU X4, 704(AX) + MOVOU X5, 720(AX) + MOVOU X6, 736(AX) + MOVOU X7, 752(AX) + MOVOU 768(AX), X0 + MOVOU 784(AX), X1 + MOVOU 800(AX), X2 + MOVOU 816(AX), X3 + MOVOU 832(AX), X4 + MOVOU 848(AX), X5 + MOVOU 864(AX), X6 + MOVOU 880(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 768(AX) + MOVOU X1, 784(AX) + MOVOU X2, 800(AX) + MOVOU X3, 816(AX) + MOVOU X4, 832(AX) + MOVOU X5, 848(AX) + MOVOU X6, 864(AX) + MOVOU X7, 880(AX) + MOVOU 896(AX), X0 + MOVOU 912(AX), X1 + MOVOU 928(AX), X2 + MOVOU 944(AX), X3 + MOVOU 960(AX), X4 + MOVOU 976(AX), X5 + MOVOU 992(AX), X6 + MOVOU 1008(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 896(AX) + MOVOU X1, 912(AX) + MOVOU X2, 928(AX) + MOVOU X3, 944(AX) + MOVOU X4, 960(AX) + MOVOU X5, 976(AX) + MOVOU X6, 992(AX) + MOVOU X7, 1008(AX) + MOVOU (AX), X0 + MOVOU 128(AX), X1 + MOVOU 256(AX), X2 + MOVOU 384(AX), X3 + MOVOU 512(AX), X4 + MOVOU 640(AX), X5 + MOVOU 768(AX), X6 + MOVOU 896(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, (AX) + MOVOU X1, 128(AX) + MOVOU X2, 256(AX) + MOVOU X3, 384(AX) + MOVOU X4, 512(AX) + MOVOU X5, 640(AX) + MOVOU X6, 768(AX) + MOVOU X7, 896(AX) + MOVOU 16(AX), X0 + MOVOU 144(AX), X1 + MOVOU 272(AX), X2 + MOVOU 400(AX), X3 + MOVOU 528(AX), X4 + MOVOU 656(AX), X5 + MOVOU 784(AX), X6 + MOVOU 912(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 16(AX) + MOVOU X1, 144(AX) + MOVOU X2, 272(AX) + MOVOU X3, 400(AX) + MOVOU X4, 528(AX) + MOVOU X5, 656(AX) + MOVOU X6, 784(AX) + MOVOU X7, 912(AX) + MOVOU 32(AX), X0 + MOVOU 160(AX), X1 + MOVOU 288(AX), X2 + MOVOU 416(AX), X3 + MOVOU 544(AX), X4 + MOVOU 672(AX), X5 + MOVOU 800(AX), X6 + MOVOU 928(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 32(AX) + MOVOU X1, 160(AX) + MOVOU X2, 288(AX) + MOVOU X3, 416(AX) + MOVOU X4, 544(AX) + MOVOU X5, 672(AX) + MOVOU X6, 800(AX) + MOVOU X7, 928(AX) + MOVOU 48(AX), X0 + MOVOU 176(AX), X1 + MOVOU 304(AX), X2 + MOVOU 432(AX), X3 + MOVOU 560(AX), X4 + MOVOU 688(AX), X5 + MOVOU 816(AX), X6 + MOVOU 944(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 48(AX) + MOVOU X1, 176(AX) + MOVOU X2, 304(AX) + MOVOU X3, 432(AX) + MOVOU X4, 560(AX) + MOVOU X5, 688(AX) + MOVOU X6, 816(AX) + MOVOU X7, 944(AX) + MOVOU 64(AX), X0 + MOVOU 192(AX), X1 + MOVOU 320(AX), X2 + MOVOU 448(AX), X3 + MOVOU 576(AX), X4 + MOVOU 704(AX), X5 + MOVOU 832(AX), X6 + MOVOU 960(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 64(AX) + MOVOU X1, 192(AX) + MOVOU X2, 320(AX) + MOVOU X3, 448(AX) + MOVOU X4, 576(AX) + MOVOU X5, 704(AX) + MOVOU X6, 832(AX) + MOVOU X7, 960(AX) + MOVOU 80(AX), X0 + MOVOU 208(AX), X1 + MOVOU 336(AX), X2 + MOVOU 464(AX), X3 + MOVOU 592(AX), X4 + MOVOU 720(AX), X5 + MOVOU 848(AX), X6 + MOVOU 976(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 80(AX) + MOVOU X1, 208(AX) + MOVOU X2, 336(AX) + MOVOU X3, 464(AX) + MOVOU X4, 592(AX) + MOVOU X5, 720(AX) + MOVOU X6, 848(AX) + MOVOU X7, 976(AX) + MOVOU 96(AX), X0 + MOVOU 224(AX), X1 + MOVOU 352(AX), X2 + MOVOU 480(AX), X3 + MOVOU 608(AX), X4 + MOVOU 736(AX), X5 + MOVOU 864(AX), X6 + MOVOU 992(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 96(AX) + MOVOU X1, 224(AX) + MOVOU X2, 352(AX) + MOVOU X3, 480(AX) + MOVOU X4, 608(AX) + MOVOU X5, 736(AX) + MOVOU X6, 864(AX) + MOVOU X7, 992(AX) + MOVOU 112(AX), X0 + MOVOU 240(AX), X1 + MOVOU 368(AX), X2 + MOVOU 496(AX), X3 + MOVOU 624(AX), X4 + MOVOU 752(AX), X5 + MOVOU 880(AX), X6 + MOVOU 1008(AX), X7 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFD $0xb1, X6, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + PSHUFB X10, X2 + MOVO X0, X8 + PMULULQ X2, X8 + PADDQ X2, X0 + PADDQ X8, X0 + PADDQ X8, X0 + PXOR X0, X6 + PSHUFB X11, X6 + MOVO X4, X8 + PMULULQ X6, X8 + PADDQ X6, X4 + PADDQ X8, X4 + PADDQ X8, X4 + PXOR X4, X2 + MOVO X2, X8 + PADDQ X2, X8 + PSRLQ $0x3f, X2 + PXOR X8, X2 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFD $0xb1, X7, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + PSHUFB X10, X3 + MOVO X1, X8 + PMULULQ X3, X8 + PADDQ X3, X1 + PADDQ X8, X1 + PADDQ X8, X1 + PXOR X1, X7 + PSHUFB X11, X7 + MOVO X5, X8 + PMULULQ X7, X8 + PADDQ X7, X5 + PADDQ X8, X5 + PADDQ X8, X5 + PXOR X5, X3 + MOVO X3, X8 + PADDQ X3, X8 + PSRLQ $0x3f, X3 + PXOR X8, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU X0, 112(AX) + MOVOU X1, 240(AX) + MOVOU X2, 368(AX) + MOVOU X3, 496(AX) + MOVOU X4, 624(AX) + MOVOU X5, 752(AX) + MOVOU X6, 880(AX) + MOVOU X7, 1008(AX) + RET - BLAMKA_ROUND_0(AX, 0, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 16, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 32, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 48, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 64, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 80, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 96, X8, X9, X10, X11) - BLAMKA_ROUND_0(AX, 112, X8, X9, X10, X11) +DATA ·c40<>+0(SB)/8, $0x0201000706050403 +DATA ·c40<>+8(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·c40<>(SB), RODATA|NOPTR, $16 - BLAMKA_ROUND_1(AX, 0, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 2, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 4, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 6, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 8, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 10, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 12, X8, X9, X10, X11) - BLAMKA_ROUND_1(AX, 14, X8, X9, X10, X11) - RET +DATA ·c48<>+0(SB)/8, $0x0100070605040302 +DATA ·c48<>+8(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·c48<>(SB), RODATA|NOPTR, $16 -// func mixBlocksSSE2(out, a, b, c *block) -TEXT ·mixBlocksSSE2(SB), 4, $0-32 +// func mixBlocksSSE2(out *block, a *block, b *block, c *block) +// Requires: SSE2 +TEXT ·mixBlocksSSE2(SB), NOSPLIT, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX MOVQ c+24(FP), CX - MOVQ $128, DI + MOVQ $0x00000080, DI loop: - MOVOU 0(AX), X0 - MOVOU 0(BX), X1 - MOVOU 0(CX), X2 + MOVOU (AX), X0 + MOVOU (BX), X1 + MOVOU (CX), X2 PXOR X1, X0 PXOR X2, X0 - MOVOU X0, 0(DX) - ADDQ $16, AX - ADDQ $16, BX - ADDQ $16, CX - ADDQ $16, DX - SUBQ $2, DI + MOVOU X0, (DX) + ADDQ $0x10, AX + ADDQ $0x10, BX + ADDQ $0x10, CX + ADDQ $0x10, DX + SUBQ $0x02, DI JA loop RET -// func xorBlocksSSE2(out, a, b, c *block) -TEXT ·xorBlocksSSE2(SB), 4, $0-32 +// func xorBlocksSSE2(out *block, a *block, b *block, c *block) +// Requires: SSE2 +TEXT ·xorBlocksSSE2(SB), NOSPLIT, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX MOVQ c+24(FP), CX - MOVQ $128, DI + MOVQ $0x00000080, DI loop: - MOVOU 0(AX), X0 - MOVOU 0(BX), X1 - MOVOU 0(CX), X2 - MOVOU 0(DX), X3 + MOVOU (AX), X0 + MOVOU (BX), X1 + MOVOU (CX), X2 + MOVOU (DX), X3 PXOR X1, X0 PXOR X2, X0 PXOR X3, X0 - MOVOU X0, 0(DX) - ADDQ $16, AX - ADDQ $16, BX - ADDQ $16, CX - ADDQ $16, DX - SUBQ $2, DI + MOVOU X0, (DX) + ADDQ $0x10, AX + ADDQ $0x10, BX + ADDQ $0x10, CX + ADDQ $0x10, DX + SUBQ $0x02, DI JA loop RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s index 9ae8206c20..f75162e039 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s @@ -1,722 +1,4517 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run blake2bAVX2_amd64_asm.go -out ../../blake2bAVX2_amd64.s -pkg blake2b. DO NOT EDIT. //go:build amd64 && gc && !purego #include "textflag.h" -DATA ·AVX2_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·AVX2_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -DATA ·AVX2_iv0<>+0x10(SB)/8, $0x3c6ef372fe94f82b -DATA ·AVX2_iv0<>+0x18(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·AVX2_iv0<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_iv1<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·AVX2_iv1<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -DATA ·AVX2_iv1<>+0x10(SB)/8, $0x1f83d9abfb41bd6b -DATA ·AVX2_iv1<>+0x18(SB)/8, $0x5be0cd19137e2179 -GLOBL ·AVX2_iv1<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·AVX2_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -DATA ·AVX2_c40<>+0x10(SB)/8, $0x0201000706050403 -DATA ·AVX2_c40<>+0x18(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·AVX2_c40<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX2_c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·AVX2_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -DATA ·AVX2_c48<>+0x10(SB)/8, $0x0100070605040302 -DATA ·AVX2_c48<>+0x18(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·AVX2_c48<>(SB), (NOPTR+RODATA), $32 - -DATA ·AVX_iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·AVX_iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -GLOBL ·AVX_iv0<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b -DATA ·AVX_iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·AVX_iv1<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv2<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·AVX_iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -GLOBL ·AVX_iv2<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b -DATA ·AVX_iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 -GLOBL ·AVX_iv3<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·AVX_c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·AVX_c40<>(SB), (NOPTR+RODATA), $16 - -DATA ·AVX_c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·AVX_c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·AVX_c48<>(SB), (NOPTR+RODATA), $16 - -#define VPERMQ_0x39_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x39 -#define VPERMQ_0x93_Y1_Y1 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xc9; BYTE $0x93 -#define VPERMQ_0x4E_Y2_Y2 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xd2; BYTE $0x4e -#define VPERMQ_0x93_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x93 -#define VPERMQ_0x39_Y3_Y3 BYTE $0xc4; BYTE $0xe3; BYTE $0xfd; BYTE $0x00; BYTE $0xdb; BYTE $0x39 - -#define ROUND_AVX2(m0, m1, m2, m3, t, c40, c48) \ - VPADDQ m0, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m1, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - VPERMQ_0x39_Y1_Y1; \ - VPERMQ_0x4E_Y2_Y2; \ - VPERMQ_0x93_Y3_Y3; \ - VPADDQ m2, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFD $-79, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPSHUFB c40, Y1, Y1; \ - VPADDQ m3, Y0, Y0; \ - VPADDQ Y1, Y0, Y0; \ - VPXOR Y0, Y3, Y3; \ - VPSHUFB c48, Y3, Y3; \ - VPADDQ Y3, Y2, Y2; \ - VPXOR Y2, Y1, Y1; \ - VPADDQ Y1, Y1, t; \ - VPSRLQ $63, Y1, Y1; \ - VPXOR t, Y1, Y1; \ - VPERMQ_0x39_Y3_Y3; \ - VPERMQ_0x4E_Y2_Y2; \ - VPERMQ_0x93_Y1_Y1 - -#define VMOVQ_SI_X11_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x1E -#define VMOVQ_SI_X12_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x26 -#define VMOVQ_SI_X13_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x2E -#define VMOVQ_SI_X14_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x36 -#define VMOVQ_SI_X15_0 BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x3E - -#define VMOVQ_SI_X11(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x5E; BYTE $n -#define VMOVQ_SI_X12(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x66; BYTE $n -#define VMOVQ_SI_X13(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x6E; BYTE $n -#define VMOVQ_SI_X14(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x76; BYTE $n -#define VMOVQ_SI_X15(n) BYTE $0xC5; BYTE $0x7A; BYTE $0x7E; BYTE $0x7E; BYTE $n - -#define VPINSRQ_1_SI_X11_0 BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x1E; BYTE $0x01 -#define VPINSRQ_1_SI_X12_0 BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x26; BYTE $0x01 -#define VPINSRQ_1_SI_X13_0 BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x2E; BYTE $0x01 -#define VPINSRQ_1_SI_X14_0 BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x36; BYTE $0x01 -#define VPINSRQ_1_SI_X15_0 BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x3E; BYTE $0x01 - -#define VPINSRQ_1_SI_X11(n) BYTE $0xC4; BYTE $0x63; BYTE $0xA1; BYTE $0x22; BYTE $0x5E; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X12(n) BYTE $0xC4; BYTE $0x63; BYTE $0x99; BYTE $0x22; BYTE $0x66; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X13(n) BYTE $0xC4; BYTE $0x63; BYTE $0x91; BYTE $0x22; BYTE $0x6E; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X14(n) BYTE $0xC4; BYTE $0x63; BYTE $0x89; BYTE $0x22; BYTE $0x76; BYTE $n; BYTE $0x01 -#define VPINSRQ_1_SI_X15(n) BYTE $0xC4; BYTE $0x63; BYTE $0x81; BYTE $0x22; BYTE $0x7E; BYTE $n; BYTE $0x01 - -#define VMOVQ_R8_X15 BYTE $0xC4; BYTE $0x41; BYTE $0xF9; BYTE $0x6E; BYTE $0xF8 -#define VPINSRQ_1_R9_X15 BYTE $0xC4; BYTE $0x43; BYTE $0x81; BYTE $0x22; BYTE $0xF9; BYTE $0x01 - -// load msg: Y12 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y12(i0, i1, i2, i3) \ - VMOVQ_SI_X12(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X12(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y12, Y12 - -// load msg: Y13 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y13(i0, i1, i2, i3) \ - VMOVQ_SI_X13(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X13(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y13, Y13 - -// load msg: Y14 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y14(i0, i1, i2, i3) \ - VMOVQ_SI_X14(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X14(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y14, Y14 - -// load msg: Y15 = (i0, i1, i2, i3) -// i0, i1, i2, i3 must not be 0 -#define LOAD_MSG_AVX2_Y15(i0, i1, i2, i3) \ - VMOVQ_SI_X15(i0*8); \ - VMOVQ_SI_X11(i2*8); \ - VPINSRQ_1_SI_X15(i1*8); \ - VPINSRQ_1_SI_X11(i3*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() \ - VMOVQ_SI_X12_0; \ - VMOVQ_SI_X11(4*8); \ - VPINSRQ_1_SI_X12(2*8); \ - VPINSRQ_1_SI_X11(6*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(1, 3, 5, 7); \ - LOAD_MSG_AVX2_Y14(8, 10, 12, 14); \ - LOAD_MSG_AVX2_Y15(9, 11, 13, 15) - -#define LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() \ - LOAD_MSG_AVX2_Y12(14, 4, 9, 13); \ - LOAD_MSG_AVX2_Y13(10, 8, 15, 6); \ - VMOVQ_SI_X11(11*8); \ - VPSHUFD $0x4E, 0*8(SI), X14; \ - VPINSRQ_1_SI_X11(5*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - LOAD_MSG_AVX2_Y15(12, 2, 7, 3) - -#define LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() \ - VMOVQ_SI_X11(5*8); \ - VMOVDQU 11*8(SI), X12; \ - VPINSRQ_1_SI_X11(15*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - VMOVQ_SI_X13(8*8); \ - VMOVQ_SI_X11(2*8); \ - VPINSRQ_1_SI_X13_0; \ - VPINSRQ_1_SI_X11(13*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(10, 3, 7, 9); \ - LOAD_MSG_AVX2_Y15(14, 6, 1, 4) - -#define LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() \ - LOAD_MSG_AVX2_Y12(7, 3, 13, 11); \ - LOAD_MSG_AVX2_Y13(9, 1, 12, 14); \ - LOAD_MSG_AVX2_Y14(2, 5, 4, 15); \ - VMOVQ_SI_X15(6*8); \ - VMOVQ_SI_X11_0; \ - VPINSRQ_1_SI_X15(10*8); \ - VPINSRQ_1_SI_X11(8*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() \ - LOAD_MSG_AVX2_Y12(9, 5, 2, 10); \ - VMOVQ_SI_X13_0; \ - VMOVQ_SI_X11(4*8); \ - VPINSRQ_1_SI_X13(7*8); \ - VPINSRQ_1_SI_X11(15*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(14, 11, 6, 3); \ - LOAD_MSG_AVX2_Y15(1, 12, 8, 13) - -#define LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X11_0; \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X11(8*8); \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(12, 10, 11, 3); \ - LOAD_MSG_AVX2_Y14(4, 7, 15, 1); \ - LOAD_MSG_AVX2_Y15(13, 5, 14, 9) - -#define LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() \ - LOAD_MSG_AVX2_Y12(12, 1, 14, 4); \ - LOAD_MSG_AVX2_Y13(5, 15, 13, 10); \ - VMOVQ_SI_X14_0; \ - VPSHUFD $0x4E, 8*8(SI), X11; \ - VPINSRQ_1_SI_X14(6*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - LOAD_MSG_AVX2_Y15(7, 3, 2, 11) - -#define LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() \ - LOAD_MSG_AVX2_Y12(13, 7, 12, 3); \ - LOAD_MSG_AVX2_Y13(11, 14, 1, 9); \ - LOAD_MSG_AVX2_Y14(5, 15, 8, 2); \ - VMOVQ_SI_X15_0; \ - VMOVQ_SI_X11(6*8); \ - VPINSRQ_1_SI_X15(4*8); \ - VPINSRQ_1_SI_X11(10*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() \ - VMOVQ_SI_X12(6*8); \ - VMOVQ_SI_X11(11*8); \ - VPINSRQ_1_SI_X12(14*8); \ - VPINSRQ_1_SI_X11_0; \ - VINSERTI128 $1, X11, Y12, Y12; \ - LOAD_MSG_AVX2_Y13(15, 9, 3, 8); \ - VMOVQ_SI_X11(1*8); \ - VMOVDQU 12*8(SI), X14; \ - VPINSRQ_1_SI_X11(10*8); \ - VINSERTI128 $1, X11, Y14, Y14; \ - VMOVQ_SI_X15(2*8); \ - VMOVDQU 4*8(SI), X11; \ - VPINSRQ_1_SI_X15(7*8); \ - VINSERTI128 $1, X11, Y15, Y15 - -#define LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() \ - LOAD_MSG_AVX2_Y12(10, 8, 7, 1); \ - VMOVQ_SI_X13(2*8); \ - VPSHUFD $0x4E, 5*8(SI), X11; \ - VPINSRQ_1_SI_X13(4*8); \ - VINSERTI128 $1, X11, Y13, Y13; \ - LOAD_MSG_AVX2_Y14(15, 9, 3, 13); \ - VMOVQ_SI_X15(11*8); \ - VMOVQ_SI_X11(12*8); \ - VPINSRQ_1_SI_X15(14*8); \ - VPINSRQ_1_SI_X11_0; \ - VINSERTI128 $1, X11, Y15, Y15 - // func hashBlocksAVX2(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksAVX2(SB), 4, $320-48 // frame size = 288 + 32 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, DX - ADDQ $31, DX - ANDQ $~31, DX - - MOVQ CX, 16(DX) - XORQ CX, CX - MOVQ CX, 24(DX) - - VMOVDQU ·AVX2_c40<>(SB), Y4 - VMOVDQU ·AVX2_c48<>(SB), Y5 - - VMOVDQU 0(AX), Y8 +// Requires: AVX, AVX2 +TEXT ·hashBlocksAVX2(SB), NOSPLIT, $320-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + MOVQ SP, DX + ADDQ $+31, DX + ANDQ $-32, DX + MOVQ CX, 16(DX) + XORQ CX, CX + MOVQ CX, 24(DX) + VMOVDQU ·AVX2_c40<>+0(SB), Y4 + VMOVDQU ·AVX2_c48<>+0(SB), Y5 + VMOVDQU (AX), Y8 VMOVDQU 32(AX), Y9 - VMOVDQU ·AVX2_iv0<>(SB), Y6 - VMOVDQU ·AVX2_iv1<>(SB), Y7 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 - MOVQ R9, 8(DX) + VMOVDQU ·AVX2_iv0<>+0(SB), Y6 + VMOVDQU ·AVX2_iv1<>+0(SB), Y7 + MOVQ (BX), R8 + MOVQ 8(BX), R9 + MOVQ R9, 8(DX) loop: - ADDQ $128, R8 - MOVQ R8, 0(DX) - CMPQ R8, $128 + ADDQ $0x80, R8 + MOVQ R8, (DX) + CMPQ R8, $0x80 JGE noinc INCQ R9 MOVQ R9, 8(DX) noinc: - VMOVDQA Y8, Y0 - VMOVDQA Y9, Y1 - VMOVDQA Y6, Y2 - VPXOR 0(DX), Y7, Y3 - - LOAD_MSG_AVX2_0_2_4_6_1_3_5_7_8_10_12_14_9_11_13_15() - VMOVDQA Y12, 32(DX) - VMOVDQA Y13, 64(DX) - VMOVDQA Y14, 96(DX) - VMOVDQA Y15, 128(DX) - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_14_4_9_13_10_8_15_6_1_0_11_5_12_2_7_3() - VMOVDQA Y12, 160(DX) - VMOVDQA Y13, 192(DX) - VMOVDQA Y14, 224(DX) - VMOVDQA Y15, 256(DX) - - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_11_12_5_15_8_0_2_13_10_3_7_9_14_6_1_4() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_7_3_13_11_9_1_12_14_2_5_4_15_6_10_0_8() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_9_5_2_10_0_7_4_15_14_11_6_3_1_12_8_13() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_2_6_0_8_12_10_11_3_4_7_15_1_13_5_14_9() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_12_1_14_4_5_15_13_10_0_6_9_8_7_3_2_11() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_13_7_12_3_11_14_1_9_5_15_8_2_0_4_6_10() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_6_14_11_0_15_9_3_8_12_13_1_10_2_7_4_5() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - LOAD_MSG_AVX2_10_8_7_1_2_4_6_5_15_9_3_13_11_14_12_0() - ROUND_AVX2(Y12, Y13, Y14, Y15, Y10, Y4, Y5) - - ROUND_AVX2(32(DX), 64(DX), 96(DX), 128(DX), Y10, Y4, Y5) - ROUND_AVX2(160(DX), 192(DX), 224(DX), 256(DX), Y10, Y4, Y5) - - VPXOR Y0, Y8, Y8 - VPXOR Y1, Y9, Y9 - VPXOR Y2, Y8, Y8 - VPXOR Y3, Y9, Y9 - - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop - - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) - - VMOVDQU Y8, 0(AX) - VMOVDQU Y9, 32(AX) + VMOVDQA Y8, Y0 + VMOVDQA Y9, Y1 + VMOVDQA Y6, Y2 + VPXOR (DX), Y7, Y3 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x26 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x20 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x10 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x30 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x08 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x28 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x38 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x40 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x60 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x70 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x68 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x58 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x78 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VMOVDQA Y12, 32(DX) + VMOVDQA Y13, 64(DX) + VMOVDQA Y14, 96(DX) + VMOVDQA Y15, 128(DX) + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x48 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x68 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x78 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x40 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x30 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x58 + VPSHUFD $0x4e, (SI), X14 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x28 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x38 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x10 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x18 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VMOVDQA Y12, 160(DX) + VMOVDQA Y13, 192(DX) + VMOVDQA Y14, 224(DX) + VMOVDQA Y15, 256(DX) + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x28 + VMOVDQU 88(SI), X12 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x78 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x40 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x10 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x2e + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x68 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x38 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x48 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x08 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x20 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x38 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x68 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x58 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x60 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x70 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x20 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x78 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x30 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x1e + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x40 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x10 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x50 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x2e + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x20 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x78 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x30 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x58 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x18 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x08 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x40 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x60 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x68 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x1e + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x40 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x58 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x18 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x20 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x78 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x08 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x68 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x70 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x48 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x70 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x20 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x28 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x68 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x50 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x36 + VPSHUFD $0x4e, 64(SI), X11 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x30 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x38 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x10 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x58 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x68 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x60 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x18 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x58 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x08 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x48 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x28 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x40 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x10 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x3e + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x30 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x50 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x30 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x58 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x1e + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x78 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x18 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x48 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x40 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x08 + VMOVDQU 96(SI), X14 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x50 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x10 + VMOVDQU 32(SI), X11 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x38 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x38 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x40 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x08 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y12, Y12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x10 + VPSHUFD $0x4e, 40(SI), X11 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x20 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y13, Y13 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x78 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x18 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x48 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x5e + BYTE $0x68 + BYTE $0x01 + VINSERTI128 $0x01, X11, Y14, Y14 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x58 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x5e + BYTE $0x60 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0xa1 + BYTE $0x22 + BYTE $0x1e + BYTE $0x01 + VINSERTI128 $0x01, X11, Y15, Y15 + VPADDQ Y12, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y13, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ Y14, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ Y15, Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + VPADDQ 32(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ 64(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ 96(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ 128(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + VPADDQ 160(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ 192(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x93 + VPADDQ 224(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFD $-79, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPSHUFB Y4, Y1, Y1 + VPADDQ 256(DX), Y0, Y0 + VPADDQ Y1, Y0, Y0 + VPXOR Y0, Y3, Y3 + VPSHUFB Y5, Y3, Y3 + VPADDQ Y3, Y2, Y2 + VPXOR Y2, Y1, Y1 + VPADDQ Y1, Y1, Y10 + VPSRLQ $0x3f, Y1, Y1 + VPXOR Y10, Y1, Y1 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xdb + BYTE $0x39 + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xd2 + BYTE $0x4e + BYTE $0xc4 + BYTE $0xe3 + BYTE $0xfd + BYTE $0x00 + BYTE $0xc9 + BYTE $0x93 + VPXOR Y0, Y8, Y8 + VPXOR Y1, Y9, Y9 + VPXOR Y2, Y8, Y8 + VPXOR Y3, Y9, Y9 + LEAQ 128(SI), SI + SUBQ $0x80, DI + JNE loop + MOVQ R8, (BX) + MOVQ R9, 8(BX) + VMOVDQU Y8, (AX) + VMOVDQU Y9, 32(AX) VZEROUPPER - RET -#define VPUNPCKLQDQ_X2_X2_X15 BYTE $0xC5; BYTE $0x69; BYTE $0x6C; BYTE $0xFA -#define VPUNPCKLQDQ_X3_X3_X15 BYTE $0xC5; BYTE $0x61; BYTE $0x6C; BYTE $0xFB -#define VPUNPCKLQDQ_X7_X7_X15 BYTE $0xC5; BYTE $0x41; BYTE $0x6C; BYTE $0xFF -#define VPUNPCKLQDQ_X13_X13_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x11; BYTE $0x6C; BYTE $0xFD -#define VPUNPCKLQDQ_X14_X14_X15 BYTE $0xC4; BYTE $0x41; BYTE $0x09; BYTE $0x6C; BYTE $0xFE - -#define VPUNPCKHQDQ_X15_X2_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x69; BYTE $0x6D; BYTE $0xD7 -#define VPUNPCKHQDQ_X15_X3_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xDF -#define VPUNPCKHQDQ_X15_X6_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x49; BYTE $0x6D; BYTE $0xF7 -#define VPUNPCKHQDQ_X15_X7_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xFF -#define VPUNPCKHQDQ_X15_X3_X2 BYTE $0xC4; BYTE $0xC1; BYTE $0x61; BYTE $0x6D; BYTE $0xD7 -#define VPUNPCKHQDQ_X15_X7_X6 BYTE $0xC4; BYTE $0xC1; BYTE $0x41; BYTE $0x6D; BYTE $0xF7 -#define VPUNPCKHQDQ_X15_X13_X3 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xDF -#define VPUNPCKHQDQ_X15_X13_X7 BYTE $0xC4; BYTE $0xC1; BYTE $0x11; BYTE $0x6D; BYTE $0xFF - -#define SHUFFLE_AVX() \ - VMOVDQA X6, X13; \ - VMOVDQA X2, X14; \ - VMOVDQA X4, X6; \ - VPUNPCKLQDQ_X13_X13_X15; \ - VMOVDQA X5, X4; \ - VMOVDQA X6, X5; \ - VPUNPCKHQDQ_X15_X7_X6; \ - VPUNPCKLQDQ_X7_X7_X15; \ - VPUNPCKHQDQ_X15_X13_X7; \ - VPUNPCKLQDQ_X3_X3_X15; \ - VPUNPCKHQDQ_X15_X2_X2; \ - VPUNPCKLQDQ_X14_X14_X15; \ - VPUNPCKHQDQ_X15_X3_X3; \ - -#define SHUFFLE_AVX_INV() \ - VMOVDQA X2, X13; \ - VMOVDQA X4, X14; \ - VPUNPCKLQDQ_X2_X2_X15; \ - VMOVDQA X5, X4; \ - VPUNPCKHQDQ_X15_X3_X2; \ - VMOVDQA X14, X5; \ - VPUNPCKLQDQ_X3_X3_X15; \ - VMOVDQA X6, X14; \ - VPUNPCKHQDQ_X15_X13_X3; \ - VPUNPCKLQDQ_X7_X7_X15; \ - VPUNPCKHQDQ_X15_X6_X6; \ - VPUNPCKLQDQ_X14_X14_X15; \ - VPUNPCKHQDQ_X15_X7_X7; \ - -#define HALF_ROUND_AVX(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ - VPADDQ m0, v0, v0; \ - VPADDQ v2, v0, v0; \ - VPADDQ m1, v1, v1; \ - VPADDQ v3, v1, v1; \ - VPXOR v0, v6, v6; \ - VPXOR v1, v7, v7; \ - VPSHUFD $-79, v6, v6; \ - VPSHUFD $-79, v7, v7; \ - VPADDQ v6, v4, v4; \ - VPADDQ v7, v5, v5; \ - VPXOR v4, v2, v2; \ - VPXOR v5, v3, v3; \ - VPSHUFB c40, v2, v2; \ - VPSHUFB c40, v3, v3; \ - VPADDQ m2, v0, v0; \ - VPADDQ v2, v0, v0; \ - VPADDQ m3, v1, v1; \ - VPADDQ v3, v1, v1; \ - VPXOR v0, v6, v6; \ - VPXOR v1, v7, v7; \ - VPSHUFB c48, v6, v6; \ - VPSHUFB c48, v7, v7; \ - VPADDQ v6, v4, v4; \ - VPADDQ v7, v5, v5; \ - VPXOR v4, v2, v2; \ - VPXOR v5, v3, v3; \ - VPADDQ v2, v2, t0; \ - VPSRLQ $63, v2, v2; \ - VPXOR t0, v2, v2; \ - VPADDQ v3, v3, t0; \ - VPSRLQ $63, v3, v3; \ - VPXOR t0, v3, v3 - -// load msg: X12 = (i0, i1), X13 = (i2, i3), X14 = (i4, i5), X15 = (i6, i7) -// i0, i1, i2, i3, i4, i5, i6, i7 must not be 0 -#define LOAD_MSG_AVX(i0, i1, i2, i3, i4, i5, i6, i7) \ - VMOVQ_SI_X12(i0*8); \ - VMOVQ_SI_X13(i2*8); \ - VMOVQ_SI_X14(i4*8); \ - VMOVQ_SI_X15(i6*8); \ - VPINSRQ_1_SI_X12(i1*8); \ - VPINSRQ_1_SI_X13(i3*8); \ - VPINSRQ_1_SI_X14(i5*8); \ - VPINSRQ_1_SI_X15(i7*8) - -// load msg: X12 = (0, 2), X13 = (4, 6), X14 = (1, 3), X15 = (5, 7) -#define LOAD_MSG_AVX_0_2_4_6_1_3_5_7() \ - VMOVQ_SI_X12_0; \ - VMOVQ_SI_X13(4*8); \ - VMOVQ_SI_X14(1*8); \ - VMOVQ_SI_X15(5*8); \ - VPINSRQ_1_SI_X12(2*8); \ - VPINSRQ_1_SI_X13(6*8); \ - VPINSRQ_1_SI_X14(3*8); \ - VPINSRQ_1_SI_X15(7*8) - -// load msg: X12 = (1, 0), X13 = (11, 5), X14 = (12, 2), X15 = (7, 3) -#define LOAD_MSG_AVX_1_0_11_5_12_2_7_3() \ - VPSHUFD $0x4E, 0*8(SI), X12; \ - VMOVQ_SI_X13(11*8); \ - VMOVQ_SI_X14(12*8); \ - VMOVQ_SI_X15(7*8); \ - VPINSRQ_1_SI_X13(5*8); \ - VPINSRQ_1_SI_X14(2*8); \ - VPINSRQ_1_SI_X15(3*8) - -// load msg: X12 = (11, 12), X13 = (5, 15), X14 = (8, 0), X15 = (2, 13) -#define LOAD_MSG_AVX_11_12_5_15_8_0_2_13() \ - VMOVDQU 11*8(SI), X12; \ - VMOVQ_SI_X13(5*8); \ - VMOVQ_SI_X14(8*8); \ - VMOVQ_SI_X15(2*8); \ - VPINSRQ_1_SI_X13(15*8); \ - VPINSRQ_1_SI_X14_0; \ - VPINSRQ_1_SI_X15(13*8) - -// load msg: X12 = (2, 5), X13 = (4, 15), X14 = (6, 10), X15 = (0, 8) -#define LOAD_MSG_AVX_2_5_4_15_6_10_0_8() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X13(4*8); \ - VMOVQ_SI_X14(6*8); \ - VMOVQ_SI_X15_0; \ - VPINSRQ_1_SI_X12(5*8); \ - VPINSRQ_1_SI_X13(15*8); \ - VPINSRQ_1_SI_X14(10*8); \ - VPINSRQ_1_SI_X15(8*8) +DATA ·AVX2_c40<>+0(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+8(SB)/8, $0x0a09080f0e0d0c0b +DATA ·AVX2_c40<>+16(SB)/8, $0x0201000706050403 +DATA ·AVX2_c40<>+24(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX2_c40<>(SB), RODATA|NOPTR, $32 -// load msg: X12 = (9, 5), X13 = (2, 10), X14 = (0, 7), X15 = (4, 15) -#define LOAD_MSG_AVX_9_5_2_10_0_7_4_15() \ - VMOVQ_SI_X12(9*8); \ - VMOVQ_SI_X13(2*8); \ - VMOVQ_SI_X14_0; \ - VMOVQ_SI_X15(4*8); \ - VPINSRQ_1_SI_X12(5*8); \ - VPINSRQ_1_SI_X13(10*8); \ - VPINSRQ_1_SI_X14(7*8); \ - VPINSRQ_1_SI_X15(15*8) +DATA ·AVX2_c48<>+0(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+8(SB)/8, $0x09080f0e0d0c0b0a +DATA ·AVX2_c48<>+16(SB)/8, $0x0100070605040302 +DATA ·AVX2_c48<>+24(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX2_c48<>(SB), RODATA|NOPTR, $32 -// load msg: X12 = (2, 6), X13 = (0, 8), X14 = (12, 10), X15 = (11, 3) -#define LOAD_MSG_AVX_2_6_0_8_12_10_11_3() \ - VMOVQ_SI_X12(2*8); \ - VMOVQ_SI_X13_0; \ - VMOVQ_SI_X14(12*8); \ - VMOVQ_SI_X15(11*8); \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X13(8*8); \ - VPINSRQ_1_SI_X14(10*8); \ - VPINSRQ_1_SI_X15(3*8) +DATA ·AVX2_iv0<>+0(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX2_iv0<>+8(SB)/8, $0xbb67ae8584caa73b +DATA ·AVX2_iv0<>+16(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX2_iv0<>+24(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX2_iv0<>(SB), RODATA|NOPTR, $32 -// load msg: X12 = (0, 6), X13 = (9, 8), X14 = (7, 3), X15 = (2, 11) -#define LOAD_MSG_AVX_0_6_9_8_7_3_2_11() \ - MOVQ 0*8(SI), X12; \ - VPSHUFD $0x4E, 8*8(SI), X13; \ - MOVQ 7*8(SI), X14; \ - MOVQ 2*8(SI), X15; \ - VPINSRQ_1_SI_X12(6*8); \ - VPINSRQ_1_SI_X14(3*8); \ - VPINSRQ_1_SI_X15(11*8) - -// load msg: X12 = (6, 14), X13 = (11, 0), X14 = (15, 9), X15 = (3, 8) -#define LOAD_MSG_AVX_6_14_11_0_15_9_3_8() \ - MOVQ 6*8(SI), X12; \ - MOVQ 11*8(SI), X13; \ - MOVQ 15*8(SI), X14; \ - MOVQ 3*8(SI), X15; \ - VPINSRQ_1_SI_X12(14*8); \ - VPINSRQ_1_SI_X13_0; \ - VPINSRQ_1_SI_X14(9*8); \ - VPINSRQ_1_SI_X15(8*8) - -// load msg: X12 = (5, 15), X13 = (8, 2), X14 = (0, 4), X15 = (6, 10) -#define LOAD_MSG_AVX_5_15_8_2_0_4_6_10() \ - MOVQ 5*8(SI), X12; \ - MOVQ 8*8(SI), X13; \ - MOVQ 0*8(SI), X14; \ - MOVQ 6*8(SI), X15; \ - VPINSRQ_1_SI_X12(15*8); \ - VPINSRQ_1_SI_X13(2*8); \ - VPINSRQ_1_SI_X14(4*8); \ - VPINSRQ_1_SI_X15(10*8) - -// load msg: X12 = (12, 13), X13 = (1, 10), X14 = (2, 7), X15 = (4, 5) -#define LOAD_MSG_AVX_12_13_1_10_2_7_4_5() \ - VMOVDQU 12*8(SI), X12; \ - MOVQ 1*8(SI), X13; \ - MOVQ 2*8(SI), X14; \ - VPINSRQ_1_SI_X13(10*8); \ - VPINSRQ_1_SI_X14(7*8); \ - VMOVDQU 4*8(SI), X15 - -// load msg: X12 = (15, 9), X13 = (3, 13), X14 = (11, 14), X15 = (12, 0) -#define LOAD_MSG_AVX_15_9_3_13_11_14_12_0() \ - MOVQ 15*8(SI), X12; \ - MOVQ 3*8(SI), X13; \ - MOVQ 11*8(SI), X14; \ - MOVQ 12*8(SI), X15; \ - VPINSRQ_1_SI_X12(9*8); \ - VPINSRQ_1_SI_X13(13*8); \ - VPINSRQ_1_SI_X14(14*8); \ - VPINSRQ_1_SI_X15_0 +DATA ·AVX2_iv1<>+0(SB)/8, $0x510e527fade682d1 +DATA ·AVX2_iv1<>+8(SB)/8, $0x9b05688c2b3e6c1f +DATA ·AVX2_iv1<>+16(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX2_iv1<>+24(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX2_iv1<>(SB), RODATA|NOPTR, $32 // func hashBlocksAVX(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksAVX(SB), 4, $288-48 // frame size = 272 + 16 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, R10 - ADDQ $15, R10 - ANDQ $~15, R10 - - VMOVDQU ·AVX_c40<>(SB), X0 - VMOVDQU ·AVX_c48<>(SB), X1 +// Requires: AVX, SSE2 +TEXT ·hashBlocksAVX(SB), NOSPLIT, $288-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + MOVQ SP, R10 + ADDQ $0x0f, R10 + ANDQ $-16, R10 + VMOVDQU ·AVX_c40<>+0(SB), X0 + VMOVDQU ·AVX_c48<>+0(SB), X1 VMOVDQA X0, X8 VMOVDQA X1, X9 - - VMOVDQU ·AVX_iv3<>(SB), X0 - VMOVDQA X0, 0(R10) - XORQ CX, 0(R10) // 0(R10) = ·AVX_iv3 ^ (CX || 0) - - VMOVDQU 0(AX), X10 + VMOVDQU ·AVX_iv3<>+0(SB), X0 + VMOVDQA X0, (R10) + XORQ CX, (R10) + VMOVDQU (AX), X10 VMOVDQU 16(AX), X11 VMOVDQU 32(AX), X2 VMOVDQU 48(AX), X3 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 + MOVQ (BX), R8 + MOVQ 8(BX), R9 loop: - ADDQ $128, R8 - CMPQ R8, $128 + ADDQ $0x80, R8 + CMPQ R8, $0x80 JGE noinc INCQ R9 noinc: - VMOVQ_R8_X15 - VPINSRQ_1_R9_X15 - + BYTE $0xc4 + BYTE $0x41 + BYTE $0xf9 + BYTE $0x6e + BYTE $0xf8 + BYTE $0xc4 + BYTE $0x43 + BYTE $0x81 + BYTE $0x22 + BYTE $0xf9 + BYTE $0x01 VMOVDQA X10, X0 VMOVDQA X11, X1 - VMOVDQU ·AVX_iv0<>(SB), X4 - VMOVDQU ·AVX_iv1<>(SB), X5 - VMOVDQU ·AVX_iv2<>(SB), X6 - + VMOVDQU ·AVX_iv0<>+0(SB), X4 + VMOVDQU ·AVX_iv1<>+0(SB), X5 + VMOVDQU ·AVX_iv2<>+0(SB), X6 VPXOR X15, X6, X6 - VMOVDQA 0(R10), X7 - - LOAD_MSG_AVX_0_2_4_6_1_3_5_7() + VMOVDQA (R10), X7 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x26 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x20 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x08 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x28 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x10 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x38 + BYTE $0x01 VMOVDQA X12, 16(R10) VMOVDQA X13, 32(R10) VMOVDQA X14, 48(R10) VMOVDQA X15, 64(R10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(8, 10, 12, 14, 9, 11, 13, 15) + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x40 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x68 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x58 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x78 + BYTE $0x01 VMOVDQA X12, 80(R10) VMOVDQA X13, 96(R10) VMOVDQA X14, 112(R10) VMOVDQA X15, 128(R10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(14, 4, 9, 13, 10, 8, 15, 6) + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x78 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x68 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x40 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x30 + BYTE $0x01 VMOVDQA X12, 144(R10) VMOVDQA X13, 160(R10) VMOVDQA X14, 176(R10) VMOVDQA X15, 192(R10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_1_0_11_5_12_2_7_3() + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + VPSHUFD $0x4e, (SI), X12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x58 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x38 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x10 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x18 + BYTE $0x01 VMOVDQA X12, 208(R10) VMOVDQA X13, 224(R10) VMOVDQA X14, 240(R10) VMOVDQA X15, 256(R10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_11_12_5_15_8_0_2_13() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(10, 3, 7, 9, 14, 6, 1, 4) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(7, 3, 13, 11, 9, 1, 12, 14) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_2_5_4_15_6_10_0_8() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_9_5_2_10_0_7_4_15() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(14, 11, 6, 3, 1, 12, 8, 13) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_2_6_0_8_12_10_11_3() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX(4, 7, 15, 1, 13, 5, 14, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(12, 1, 14, 4, 5, 15, 13, 10) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_0_6_9_8_7_3_2_11() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(13, 7, 12, 3, 11, 14, 1, 9) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_5_15_8_2_0_4_6_10() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX_6_14_11_0_15_9_3_8() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_12_13_1_10_2_7_4_5() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - LOAD_MSG_AVX(10, 8, 7, 1, 2, 4, 6, 5) - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX() - LOAD_MSG_AVX_15_9_3_13_11_14_12_0() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, X12, X13, X14, X15, X15, X8, X9) - SHUFFLE_AVX_INV() - - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X15, X8, X9) - SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X15, X8, X9) - SHUFFLE_AVX_INV() - - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X15, X8, X9) - SHUFFLE_AVX() - HALF_ROUND_AVX(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X15, X8, X9) - SHUFFLE_AVX_INV() - + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + VMOVDQU 88(SI), X12 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x28 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x40 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x10 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x36 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x68 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x38 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x08 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x48 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x20 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x38 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x68 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x60 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x58 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x70 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x20 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x30 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x3e + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x40 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x48 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x36 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x20 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x78 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x30 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x08 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x40 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x58 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x60 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x68 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x2e + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x58 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x40 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x18 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x20 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x78 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x68 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x70 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x28 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x48 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x70 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x28 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x68 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x50 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + MOVQ (SI), X12 + VPSHUFD $0x4e, 64(SI), X13 + MOVQ 56(SI), X14 + MOVQ 16(SI), X15 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x30 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x58 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x68 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x60 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x58 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x08 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x38 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x18 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x48 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + MOVQ 40(SI), X12 + MOVQ 64(SI), X13 + MOVQ (SI), X14 + MOVQ 48(SI), X15 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x78 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x10 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x50 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + MOVQ 48(SI), X12 + MOVQ 88(SI), X13 + MOVQ 120(SI), X14 + MOVQ 24(SI), X15 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x2e + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x48 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x40 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + VMOVDQU 96(SI), X12 + MOVQ 8(SI), X13 + MOVQ 16(SI), X14 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x50 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x38 + BYTE $0x01 + VMOVDQU 32(SI), X15 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x66 + BYTE $0x50 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x6e + BYTE $0x38 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x76 + BYTE $0x10 + BYTE $0xc5 + BYTE $0x7a + BYTE $0x7e + BYTE $0x7e + BYTE $0x30 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x40 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x08 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x20 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x7e + BYTE $0x28 + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + MOVQ 120(SI), X12 + MOVQ 24(SI), X13 + MOVQ 88(SI), X14 + MOVQ 96(SI), X15 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x99 + BYTE $0x22 + BYTE $0x66 + BYTE $0x48 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x91 + BYTE $0x22 + BYTE $0x6e + BYTE $0x68 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x89 + BYTE $0x22 + BYTE $0x76 + BYTE $0x70 + BYTE $0x01 + BYTE $0xc4 + BYTE $0x63 + BYTE $0x81 + BYTE $0x22 + BYTE $0x3e + BYTE $0x01 + VPADDQ X12, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X13, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ X14, X0, X0 + VPADDQ X2, X0, X0 + VPADDQ X15, X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + VPADDQ 16(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 32(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ 48(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 64(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + VPADDQ 80(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 96(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ 112(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 128(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff + VPADDQ 144(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 160(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ 176(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 192(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X6, X13 + VMOVDQA X2, X14 + VMOVDQA X4, X6 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x11 + BYTE $0x6c + BYTE $0xfd + VMOVDQA X5, X4 + VMOVDQA X6, X5 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xff + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x69 + BYTE $0x6d + BYTE $0xd7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xdf + VPADDQ 208(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 224(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFD $-79, X6, X6 + VPSHUFD $-79, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPSHUFB X8, X2, X2 + VPSHUFB X8, X3, X3 + VPADDQ 240(R10), X0, X0 + VPADDQ X2, X0, X0 + VPADDQ 256(R10), X1, X1 + VPADDQ X3, X1, X1 + VPXOR X0, X6, X6 + VPXOR X1, X7, X7 + VPSHUFB X9, X6, X6 + VPSHUFB X9, X7, X7 + VPADDQ X6, X4, X4 + VPADDQ X7, X5, X5 + VPXOR X4, X2, X2 + VPXOR X5, X3, X3 + VPADDQ X2, X2, X15 + VPSRLQ $0x3f, X2, X2 + VPXOR X15, X2, X2 + VPADDQ X3, X3, X15 + VPSRLQ $0x3f, X3, X3 + VPXOR X15, X3, X3 + VMOVDQA X2, X13 + VMOVDQA X4, X14 + BYTE $0xc5 + BYTE $0x69 + BYTE $0x6c + BYTE $0xfa + VMOVDQA X5, X4 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x61 + BYTE $0x6d + BYTE $0xd7 + VMOVDQA X14, X5 + BYTE $0xc5 + BYTE $0x61 + BYTE $0x6c + BYTE $0xfb + VMOVDQA X6, X14 + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x11 + BYTE $0x6d + BYTE $0xdf + BYTE $0xc5 + BYTE $0x41 + BYTE $0x6c + BYTE $0xff + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x49 + BYTE $0x6d + BYTE $0xf7 + BYTE $0xc4 + BYTE $0x41 + BYTE $0x09 + BYTE $0x6c + BYTE $0xfe + BYTE $0xc4 + BYTE $0xc1 + BYTE $0x41 + BYTE $0x6d + BYTE $0xff VMOVDQU 32(AX), X14 VMOVDQU 48(AX), X15 VPXOR X0, X10, X10 @@ -729,16 +4524,36 @@ noinc: VPXOR X7, X15, X3 VMOVDQU X2, 32(AX) VMOVDQU X3, 48(AX) + LEAQ 128(SI), SI + SUBQ $0x80, DI + JNE loop + VMOVDQU X10, (AX) + VMOVDQU X11, 16(AX) + MOVQ R8, (BX) + MOVQ R9, 8(BX) + VZEROUPPER + RET - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop +DATA ·AVX_c40<>+0(SB)/8, $0x0201000706050403 +DATA ·AVX_c40<>+8(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·AVX_c40<>(SB), RODATA|NOPTR, $16 - VMOVDQU X10, 0(AX) - VMOVDQU X11, 16(AX) +DATA ·AVX_c48<>+0(SB)/8, $0x0100070605040302 +DATA ·AVX_c48<>+8(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·AVX_c48<>(SB), RODATA|NOPTR, $16 - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) - VZEROUPPER +DATA ·AVX_iv3<>+0(SB)/8, $0x1f83d9abfb41bd6b +DATA ·AVX_iv3<>+8(SB)/8, $0x5be0cd19137e2179 +GLOBL ·AVX_iv3<>(SB), RODATA|NOPTR, $16 - RET +DATA ·AVX_iv0<>+0(SB)/8, $0x6a09e667f3bcc908 +DATA ·AVX_iv0<>+8(SB)/8, $0xbb67ae8584caa73b +GLOBL ·AVX_iv0<>(SB), RODATA|NOPTR, $16 + +DATA ·AVX_iv1<>+0(SB)/8, $0x3c6ef372fe94f82b +DATA ·AVX_iv1<>+8(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·AVX_iv1<>(SB), RODATA|NOPTR, $16 + +DATA ·AVX_iv2<>+0(SB)/8, $0x510e527fade682d1 +DATA ·AVX_iv2<>+8(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·AVX_iv2<>(SB), RODATA|NOPTR, $16 diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s index adfac00c15..9a0ce21244 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s +++ b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.s @@ -1,278 +1,1441 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run blake2b_amd64_asm.go -out ../../blake2b_amd64.s -pkg blake2b. DO NOT EDIT. //go:build amd64 && gc && !purego #include "textflag.h" -DATA ·iv0<>+0x00(SB)/8, $0x6a09e667f3bcc908 -DATA ·iv0<>+0x08(SB)/8, $0xbb67ae8584caa73b -GLOBL ·iv0<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv1<>+0x00(SB)/8, $0x3c6ef372fe94f82b -DATA ·iv1<>+0x08(SB)/8, $0xa54ff53a5f1d36f1 -GLOBL ·iv1<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv2<>+0x00(SB)/8, $0x510e527fade682d1 -DATA ·iv2<>+0x08(SB)/8, $0x9b05688c2b3e6c1f -GLOBL ·iv2<>(SB), (NOPTR+RODATA), $16 - -DATA ·iv3<>+0x00(SB)/8, $0x1f83d9abfb41bd6b -DATA ·iv3<>+0x08(SB)/8, $0x5be0cd19137e2179 -GLOBL ·iv3<>(SB), (NOPTR+RODATA), $16 - -DATA ·c40<>+0x00(SB)/8, $0x0201000706050403 -DATA ·c40<>+0x08(SB)/8, $0x0a09080f0e0d0c0b -GLOBL ·c40<>(SB), (NOPTR+RODATA), $16 - -DATA ·c48<>+0x00(SB)/8, $0x0100070605040302 -DATA ·c48<>+0x08(SB)/8, $0x09080f0e0d0c0b0a -GLOBL ·c48<>(SB), (NOPTR+RODATA), $16 - -#define SHUFFLE(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v6, t1; \ - PUNPCKLQDQ v6, t2; \ - PUNPCKHQDQ v7, v6; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ v7, t2; \ - MOVO t1, v7; \ - MOVO v2, t1; \ - PUNPCKHQDQ t2, v7; \ - PUNPCKLQDQ v3, t2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v3 - -#define SHUFFLE_INV(v2, v3, v4, v5, v6, v7, t1, t2) \ - MOVO v4, t1; \ - MOVO v5, v4; \ - MOVO t1, v5; \ - MOVO v2, t1; \ - PUNPCKLQDQ v2, t2; \ - PUNPCKHQDQ v3, v2; \ - PUNPCKHQDQ t2, v2; \ - PUNPCKLQDQ v3, t2; \ - MOVO t1, v3; \ - MOVO v6, t1; \ - PUNPCKHQDQ t2, v3; \ - PUNPCKLQDQ v7, t2; \ - PUNPCKHQDQ t2, v6; \ - PUNPCKLQDQ t1, t2; \ - PUNPCKHQDQ t2, v7 - -#define HALF_ROUND(v0, v1, v2, v3, v4, v5, v6, v7, m0, m1, m2, m3, t0, c40, c48) \ - PADDQ m0, v0; \ - PADDQ m1, v1; \ - PADDQ v2, v0; \ - PADDQ v3, v1; \ - PXOR v0, v6; \ - PXOR v1, v7; \ - PSHUFD $0xB1, v6, v6; \ - PSHUFD $0xB1, v7, v7; \ - PADDQ v6, v4; \ - PADDQ v7, v5; \ - PXOR v4, v2; \ - PXOR v5, v3; \ - PSHUFB c40, v2; \ - PSHUFB c40, v3; \ - PADDQ m2, v0; \ - PADDQ m3, v1; \ - PADDQ v2, v0; \ - PADDQ v3, v1; \ - PXOR v0, v6; \ - PXOR v1, v7; \ - PSHUFB c48, v6; \ - PSHUFB c48, v7; \ - PADDQ v6, v4; \ - PADDQ v7, v5; \ - PXOR v4, v2; \ - PXOR v5, v3; \ - MOVOU v2, t0; \ - PADDQ v2, t0; \ - PSRLQ $63, v2; \ - PXOR t0, v2; \ - MOVOU v3, t0; \ - PADDQ v3, t0; \ - PSRLQ $63, v3; \ - PXOR t0, v3 - -#define LOAD_MSG(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7) \ - MOVQ i0*8(src), m0; \ - PINSRQ $1, i1*8(src), m0; \ - MOVQ i2*8(src), m1; \ - PINSRQ $1, i3*8(src), m1; \ - MOVQ i4*8(src), m2; \ - PINSRQ $1, i5*8(src), m2; \ - MOVQ i6*8(src), m3; \ - PINSRQ $1, i7*8(src), m3 - // func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) -TEXT ·hashBlocksSSE4(SB), 4, $288-48 // frame size = 272 + 16 byte alignment - MOVQ h+0(FP), AX - MOVQ c+8(FP), BX - MOVQ flag+16(FP), CX - MOVQ blocks_base+24(FP), SI - MOVQ blocks_len+32(FP), DI - - MOVQ SP, R10 - ADDQ $15, R10 - ANDQ $~15, R10 - - MOVOU ·iv3<>(SB), X0 - MOVO X0, 0(R10) - XORQ CX, 0(R10) // 0(R10) = ·iv3 ^ (CX || 0) - - MOVOU ·c40<>(SB), X13 - MOVOU ·c48<>(SB), X14 - - MOVOU 0(AX), X12 +// Requires: SSE2, SSE4.1, SSSE3 +TEXT ·hashBlocksSSE4(SB), NOSPLIT, $288-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVQ flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DI + MOVQ SP, R10 + ADDQ $0x0f, R10 + ANDQ $-16, R10 + MOVOU ·iv3<>+0(SB), X0 + MOVO X0, (R10) + XORQ CX, (R10) + MOVOU ·c40<>+0(SB), X13 + MOVOU ·c48<>+0(SB), X14 + MOVOU (AX), X12 MOVOU 16(AX), X15 - - MOVQ 0(BX), R8 - MOVQ 8(BX), R9 + MOVQ (BX), R8 + MOVQ 8(BX), R9 loop: - ADDQ $128, R8 - CMPQ R8, $128 + ADDQ $0x80, R8 + CMPQ R8, $0x80 JGE noinc INCQ R9 noinc: - MOVQ R8, X8 - PINSRQ $1, R9, X8 - - MOVO X12, X0 - MOVO X15, X1 - MOVOU 32(AX), X2 - MOVOU 48(AX), X3 - MOVOU ·iv0<>(SB), X4 - MOVOU ·iv1<>(SB), X5 - MOVOU ·iv2<>(SB), X6 - - PXOR X8, X6 - MOVO 0(R10), X7 - - LOAD_MSG(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7) - MOVO X8, 16(R10) - MOVO X9, 32(R10) - MOVO X10, 48(R10) - MOVO X11, 64(R10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 8, 10, 12, 14, 9, 11, 13, 15) - MOVO X8, 80(R10) - MOVO X9, 96(R10) - MOVO X10, 112(R10) - MOVO X11, 128(R10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6) - MOVO X8, 144(R10) - MOVO X9, 160(R10) - MOVO X10, 176(R10) - MOVO X11, 192(R10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 1, 0, 11, 5, 12, 2, 7, 3) - MOVO X8, 208(R10) - MOVO X9, 224(R10) - MOVO X10, 240(R10) - MOVO X11, 256(R10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 10, 3, 7, 9, 14, 6, 1, 4) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 2, 5, 4, 15, 6, 10, 0, 8) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 14, 11, 6, 3, 1, 12, 8, 13) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 4, 7, 15, 1, 13, 5, 14, 9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 0, 6, 9, 8, 7, 3, 2, 11) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 5, 15, 8, 2, 0, 4, 6, 10) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 12, 13, 1, 10, 2, 7, 4, 5) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - LOAD_MSG(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - LOAD_MSG(X8, X9, X10, X11, SI, 15, 9, 3, 13, 11, 14, 12, 0) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) - - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 16(R10), 32(R10), 48(R10), 64(R10), X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 80(R10), 96(R10), 112(R10), 128(R10), X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) + MOVQ R8, X8 + PINSRQ $0x01, R9, X8 + MOVO X12, X0 + MOVO X15, X1 + MOVOU 32(AX), X2 + MOVOU 48(AX), X3 + MOVOU ·iv0<>+0(SB), X4 + MOVOU ·iv1<>+0(SB), X5 + MOVOU ·iv2<>+0(SB), X6 + PXOR X8, X6 + MOVO (R10), X7 + MOVQ (SI), X8 + PINSRQ $0x01, 16(SI), X8 + MOVQ 32(SI), X9 + PINSRQ $0x01, 48(SI), X9 + MOVQ 8(SI), X10 + PINSRQ $0x01, 24(SI), X10 + MOVQ 40(SI), X11 + PINSRQ $0x01, 56(SI), X11 + MOVO X8, 16(R10) + MOVO X9, 32(R10) + MOVO X10, 48(R10) + MOVO X11, 64(R10) + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 64(SI), X8 + PINSRQ $0x01, 80(SI), X8 + MOVQ 96(SI), X9 + PINSRQ $0x01, 112(SI), X9 + MOVQ 72(SI), X10 + PINSRQ $0x01, 88(SI), X10 + MOVQ 104(SI), X11 + PINSRQ $0x01, 120(SI), X11 + MOVO X8, 80(R10) + MOVO X9, 96(R10) + MOVO X10, 112(R10) + MOVO X11, 128(R10) + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 112(SI), X8 + PINSRQ $0x01, 32(SI), X8 + MOVQ 72(SI), X9 + PINSRQ $0x01, 104(SI), X9 + MOVQ 80(SI), X10 + PINSRQ $0x01, 64(SI), X10 + MOVQ 120(SI), X11 + PINSRQ $0x01, 48(SI), X11 + MOVO X8, 144(R10) + MOVO X9, 160(R10) + MOVO X10, 176(R10) + MOVO X11, 192(R10) + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 8(SI), X8 + PINSRQ $0x01, (SI), X8 + MOVQ 88(SI), X9 + PINSRQ $0x01, 40(SI), X9 + MOVQ 96(SI), X10 + PINSRQ $0x01, 16(SI), X10 + MOVQ 56(SI), X11 + PINSRQ $0x01, 24(SI), X11 + MOVO X8, 208(R10) + MOVO X9, 224(R10) + MOVO X10, 240(R10) + MOVO X11, 256(R10) + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 88(SI), X8 + PINSRQ $0x01, 96(SI), X8 + MOVQ 40(SI), X9 + PINSRQ $0x01, 120(SI), X9 + MOVQ 64(SI), X10 + PINSRQ $0x01, (SI), X10 + MOVQ 16(SI), X11 + PINSRQ $0x01, 104(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 80(SI), X8 + PINSRQ $0x01, 24(SI), X8 + MOVQ 56(SI), X9 + PINSRQ $0x01, 72(SI), X9 + MOVQ 112(SI), X10 + PINSRQ $0x01, 48(SI), X10 + MOVQ 8(SI), X11 + PINSRQ $0x01, 32(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 56(SI), X8 + PINSRQ $0x01, 24(SI), X8 + MOVQ 104(SI), X9 + PINSRQ $0x01, 88(SI), X9 + MOVQ 72(SI), X10 + PINSRQ $0x01, 8(SI), X10 + MOVQ 96(SI), X11 + PINSRQ $0x01, 112(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 16(SI), X8 + PINSRQ $0x01, 40(SI), X8 + MOVQ 32(SI), X9 + PINSRQ $0x01, 120(SI), X9 + MOVQ 48(SI), X10 + PINSRQ $0x01, 80(SI), X10 + MOVQ (SI), X11 + PINSRQ $0x01, 64(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 72(SI), X8 + PINSRQ $0x01, 40(SI), X8 + MOVQ 16(SI), X9 + PINSRQ $0x01, 80(SI), X9 + MOVQ (SI), X10 + PINSRQ $0x01, 56(SI), X10 + MOVQ 32(SI), X11 + PINSRQ $0x01, 120(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 112(SI), X8 + PINSRQ $0x01, 88(SI), X8 + MOVQ 48(SI), X9 + PINSRQ $0x01, 24(SI), X9 + MOVQ 8(SI), X10 + PINSRQ $0x01, 96(SI), X10 + MOVQ 64(SI), X11 + PINSRQ $0x01, 104(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 16(SI), X8 + PINSRQ $0x01, 48(SI), X8 + MOVQ (SI), X9 + PINSRQ $0x01, 64(SI), X9 + MOVQ 96(SI), X10 + PINSRQ $0x01, 80(SI), X10 + MOVQ 88(SI), X11 + PINSRQ $0x01, 24(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 32(SI), X8 + PINSRQ $0x01, 56(SI), X8 + MOVQ 120(SI), X9 + PINSRQ $0x01, 8(SI), X9 + MOVQ 104(SI), X10 + PINSRQ $0x01, 40(SI), X10 + MOVQ 112(SI), X11 + PINSRQ $0x01, 72(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 96(SI), X8 + PINSRQ $0x01, 8(SI), X8 + MOVQ 112(SI), X9 + PINSRQ $0x01, 32(SI), X9 + MOVQ 40(SI), X10 + PINSRQ $0x01, 120(SI), X10 + MOVQ 104(SI), X11 + PINSRQ $0x01, 80(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ (SI), X8 + PINSRQ $0x01, 48(SI), X8 + MOVQ 72(SI), X9 + PINSRQ $0x01, 64(SI), X9 + MOVQ 56(SI), X10 + PINSRQ $0x01, 24(SI), X10 + MOVQ 16(SI), X11 + PINSRQ $0x01, 88(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 104(SI), X8 + PINSRQ $0x01, 56(SI), X8 + MOVQ 96(SI), X9 + PINSRQ $0x01, 24(SI), X9 + MOVQ 88(SI), X10 + PINSRQ $0x01, 112(SI), X10 + MOVQ 8(SI), X11 + PINSRQ $0x01, 72(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 40(SI), X8 + PINSRQ $0x01, 120(SI), X8 + MOVQ 64(SI), X9 + PINSRQ $0x01, 16(SI), X9 + MOVQ (SI), X10 + PINSRQ $0x01, 32(SI), X10 + MOVQ 48(SI), X11 + PINSRQ $0x01, 80(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 48(SI), X8 + PINSRQ $0x01, 112(SI), X8 + MOVQ 88(SI), X9 + PINSRQ $0x01, (SI), X9 + MOVQ 120(SI), X10 + PINSRQ $0x01, 72(SI), X10 + MOVQ 24(SI), X11 + PINSRQ $0x01, 64(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 96(SI), X8 + PINSRQ $0x01, 104(SI), X8 + MOVQ 8(SI), X9 + PINSRQ $0x01, 80(SI), X9 + MOVQ 16(SI), X10 + PINSRQ $0x01, 56(SI), X10 + MOVQ 32(SI), X11 + PINSRQ $0x01, 40(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVQ 80(SI), X8 + PINSRQ $0x01, 64(SI), X8 + MOVQ 56(SI), X9 + PINSRQ $0x01, 8(SI), X9 + MOVQ 16(SI), X10 + PINSRQ $0x01, 32(SI), X10 + MOVQ 48(SI), X11 + PINSRQ $0x01, 40(SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + MOVQ 120(SI), X8 + PINSRQ $0x01, 72(SI), X8 + MOVQ 24(SI), X9 + PINSRQ $0x01, 104(SI), X9 + MOVQ 88(SI), X10 + PINSRQ $0x01, 112(SI), X10 + MOVQ 96(SI), X11 + PINSRQ $0x01, (SI), X11 + PADDQ X8, X0 + PADDQ X9, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ X10, X0 + PADDQ X11, X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + PADDQ 16(R10), X0 + PADDQ 32(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ 48(R10), X0 + PADDQ 64(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + PADDQ 80(R10), X0 + PADDQ 96(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ 112(R10), X0 + PADDQ 128(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + PADDQ 144(R10), X0 + PADDQ 160(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ 176(R10), X0 + PADDQ 192(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X6, X8 + PUNPCKLQDQ X6, X9 + PUNPCKHQDQ X7, X6 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X7, X9 + MOVO X8, X7 + MOVO X2, X8 + PUNPCKHQDQ X9, X7 + PUNPCKLQDQ X3, X9 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X3 + PADDQ 208(R10), X0 + PADDQ 224(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFD $0xb1, X6, X6 + PSHUFD $0xb1, X7, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + PSHUFB X13, X2 + PSHUFB X13, X3 + PADDQ 240(R10), X0 + PADDQ 256(R10), X1 + PADDQ X2, X0 + PADDQ X3, X1 + PXOR X0, X6 + PXOR X1, X7 + PSHUFB X14, X6 + PSHUFB X14, X7 + PADDQ X6, X4 + PADDQ X7, X5 + PXOR X4, X2 + PXOR X5, X3 + MOVOU X2, X11 + PADDQ X2, X11 + PSRLQ $0x3f, X2 + PXOR X11, X2 + MOVOU X3, X11 + PADDQ X3, X11 + PSRLQ $0x3f, X3 + PXOR X11, X3 + MOVO X4, X8 + MOVO X5, X4 + MOVO X8, X5 + MOVO X2, X8 + PUNPCKLQDQ X2, X9 + PUNPCKHQDQ X3, X2 + PUNPCKHQDQ X9, X2 + PUNPCKLQDQ X3, X9 + MOVO X8, X3 + MOVO X6, X8 + PUNPCKHQDQ X9, X3 + PUNPCKLQDQ X7, X9 + PUNPCKHQDQ X9, X6 + PUNPCKLQDQ X8, X9 + PUNPCKHQDQ X9, X7 + MOVOU 32(AX), X10 + MOVOU 48(AX), X11 + PXOR X0, X12 + PXOR X1, X15 + PXOR X2, X10 + PXOR X3, X11 + PXOR X4, X12 + PXOR X5, X15 + PXOR X6, X10 + PXOR X7, X11 + MOVOU X10, 32(AX) + MOVOU X11, 48(AX) + LEAQ 128(SI), SI + SUBQ $0x80, DI + JNE loop + MOVOU X12, (AX) + MOVOU X15, 16(AX) + MOVQ R8, (BX) + MOVQ R9, 8(BX) + RET - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 144(R10), 160(R10), 176(R10), 192(R10), X11, X13, X14) - SHUFFLE(X2, X3, X4, X5, X6, X7, X8, X9) - HALF_ROUND(X0, X1, X2, X3, X4, X5, X6, X7, 208(R10), 224(R10), 240(R10), 256(R10), X11, X13, X14) - SHUFFLE_INV(X2, X3, X4, X5, X6, X7, X8, X9) +DATA ·iv3<>+0(SB)/8, $0x1f83d9abfb41bd6b +DATA ·iv3<>+8(SB)/8, $0x5be0cd19137e2179 +GLOBL ·iv3<>(SB), RODATA|NOPTR, $16 - MOVOU 32(AX), X10 - MOVOU 48(AX), X11 - PXOR X0, X12 - PXOR X1, X15 - PXOR X2, X10 - PXOR X3, X11 - PXOR X4, X12 - PXOR X5, X15 - PXOR X6, X10 - PXOR X7, X11 - MOVOU X10, 32(AX) - MOVOU X11, 48(AX) +DATA ·c40<>+0(SB)/8, $0x0201000706050403 +DATA ·c40<>+8(SB)/8, $0x0a09080f0e0d0c0b +GLOBL ·c40<>(SB), RODATA|NOPTR, $16 - LEAQ 128(SI), SI - SUBQ $128, DI - JNE loop +DATA ·c48<>+0(SB)/8, $0x0100070605040302 +DATA ·c48<>+8(SB)/8, $0x09080f0e0d0c0b0a +GLOBL ·c48<>(SB), RODATA|NOPTR, $16 - MOVOU X12, 0(AX) - MOVOU X15, 16(AX) +DATA ·iv0<>+0(SB)/8, $0x6a09e667f3bcc908 +DATA ·iv0<>+8(SB)/8, $0xbb67ae8584caa73b +GLOBL ·iv0<>(SB), RODATA|NOPTR, $16 - MOVQ R8, 0(BX) - MOVQ R9, 8(BX) +DATA ·iv1<>+0(SB)/8, $0x3c6ef372fe94f82b +DATA ·iv1<>+8(SB)/8, $0xa54ff53a5f1d36f1 +GLOBL ·iv1<>(SB), RODATA|NOPTR, $16 - RET +DATA ·iv2<>+0(SB)/8, $0x510e527fade682d1 +DATA ·iv2<>+8(SB)/8, $0x9b05688c2b3e6c1f +GLOBL ·iv2<>(SB), RODATA|NOPTR, $16 diff --git a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s index fe4b818a33..57d510fc08 100644 --- a/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s +++ b/vendor/golang.org/x/crypto/blake2s/blake2s_amd64.s @@ -1,432 +1,2173 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run blake2s_amd64_asm.go -out ../blake2s_amd64.s -pkg blake2s. DO NOT EDIT. //go:build amd64 && gc && !purego #include "textflag.h" -DATA iv0<>+0x00(SB)/4, $0x6a09e667 -DATA iv0<>+0x04(SB)/4, $0xbb67ae85 -DATA iv0<>+0x08(SB)/4, $0x3c6ef372 -DATA iv0<>+0x0c(SB)/4, $0xa54ff53a -GLOBL iv0<>(SB), (NOPTR+RODATA), $16 - -DATA iv1<>+0x00(SB)/4, $0x510e527f -DATA iv1<>+0x04(SB)/4, $0x9b05688c -DATA iv1<>+0x08(SB)/4, $0x1f83d9ab -DATA iv1<>+0x0c(SB)/4, $0x5be0cd19 -GLOBL iv1<>(SB), (NOPTR+RODATA), $16 - -DATA rol16<>+0x00(SB)/8, $0x0504070601000302 -DATA rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A -GLOBL rol16<>(SB), (NOPTR+RODATA), $16 - -DATA rol8<>+0x00(SB)/8, $0x0407060500030201 -DATA rol8<>+0x08(SB)/8, $0x0C0F0E0D080B0A09 -GLOBL rol8<>(SB), (NOPTR+RODATA), $16 - -DATA counter<>+0x00(SB)/8, $0x40 -DATA counter<>+0x08(SB)/8, $0x0 -GLOBL counter<>(SB), (NOPTR+RODATA), $16 - -#define ROTL_SSE2(n, t, v) \ - MOVO v, t; \ - PSLLL $n, t; \ - PSRLL $(32-n), v; \ - PXOR t, v - -#define ROTL_SSSE3(c, v) \ - PSHUFB c, v - -#define ROUND_SSE2(v0, v1, v2, v3, m0, m1, m2, m3, t) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(16, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSE2(24, t, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - -#define ROUND_SSSE3(v0, v1, v2, v3, m0, m1, m2, m3, t, c16, c8) \ - PADDL m0, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m1, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v1, v1; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v3, v3; \ - PADDL m2, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c16, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(20, t, v1); \ - PADDL m3, v0; \ - PADDL v1, v0; \ - PXOR v0, v3; \ - ROTL_SSSE3(c8, v3); \ - PADDL v3, v2; \ - PXOR v2, v1; \ - ROTL_SSE2(25, t, v1); \ - PSHUFL $0x39, v3, v3; \ - PSHUFL $0x4E, v2, v2; \ - PSHUFL $0x93, v1, v1 - - -#define LOAD_MSG_SSE4(m0, m1, m2, m3, src, i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15) \ - MOVL i0*4(src), m0; \ - PINSRD $1, i1*4(src), m0; \ - PINSRD $2, i2*4(src), m0; \ - PINSRD $3, i3*4(src), m0; \ - MOVL i4*4(src), m1; \ - PINSRD $1, i5*4(src), m1; \ - PINSRD $2, i6*4(src), m1; \ - PINSRD $3, i7*4(src), m1; \ - MOVL i8*4(src), m2; \ - PINSRD $1, i9*4(src), m2; \ - PINSRD $2, i10*4(src), m2; \ - PINSRD $3, i11*4(src), m2; \ - MOVL i12*4(src), m3; \ - PINSRD $1, i13*4(src), m3; \ - PINSRD $2, i14*4(src), m3; \ - PINSRD $3, i15*4(src), m3 +// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) +// Requires: SSE2 +TEXT ·hashBlocksSSE2(SB), $672-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVL flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DX + MOVQ SP, BP + ADDQ $0x0f, BP + ANDQ $-16, BP + MOVQ (BX), R9 + MOVQ R9, (BP) + MOVQ CX, 8(BP) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU iv0<>+0(SB), X2 + MOVOU iv1<>+0(SB), X3 + MOVOU counter<>+0(SB), X12 + MOVOU rol16<>+0(SB), X13 + MOVOU rol8<>+0(SB), X14 + MOVO (BP), X15 -#define PRECOMPUTE_MSG(dst, off, src, R8, R9, R10, R11, R12, R13, R14, R15) \ - MOVQ 0*4(src), R8; \ - MOVQ 2*4(src), R9; \ - MOVQ 4*4(src), R10; \ - MOVQ 6*4(src), R11; \ - MOVQ 8*4(src), R12; \ - MOVQ 10*4(src), R13; \ - MOVQ 12*4(src), R14; \ - MOVQ 14*4(src), R15; \ - \ - MOVL R8, 0*4+off+0(dst); \ - MOVL R8, 9*4+off+64(dst); \ - MOVL R8, 5*4+off+128(dst); \ - MOVL R8, 14*4+off+192(dst); \ - MOVL R8, 4*4+off+256(dst); \ - MOVL R8, 2*4+off+320(dst); \ - MOVL R8, 8*4+off+384(dst); \ - MOVL R8, 12*4+off+448(dst); \ - MOVL R8, 3*4+off+512(dst); \ - MOVL R8, 15*4+off+576(dst); \ - SHRQ $32, R8; \ - MOVL R8, 4*4+off+0(dst); \ - MOVL R8, 8*4+off+64(dst); \ - MOVL R8, 14*4+off+128(dst); \ - MOVL R8, 5*4+off+192(dst); \ - MOVL R8, 12*4+off+256(dst); \ - MOVL R8, 11*4+off+320(dst); \ - MOVL R8, 1*4+off+384(dst); \ - MOVL R8, 6*4+off+448(dst); \ - MOVL R8, 10*4+off+512(dst); \ - MOVL R8, 3*4+off+576(dst); \ - \ - MOVL R9, 1*4+off+0(dst); \ - MOVL R9, 13*4+off+64(dst); \ - MOVL R9, 6*4+off+128(dst); \ - MOVL R9, 8*4+off+192(dst); \ - MOVL R9, 2*4+off+256(dst); \ - MOVL R9, 0*4+off+320(dst); \ - MOVL R9, 14*4+off+384(dst); \ - MOVL R9, 11*4+off+448(dst); \ - MOVL R9, 12*4+off+512(dst); \ - MOVL R9, 4*4+off+576(dst); \ - SHRQ $32, R9; \ - MOVL R9, 5*4+off+0(dst); \ - MOVL R9, 15*4+off+64(dst); \ - MOVL R9, 9*4+off+128(dst); \ - MOVL R9, 1*4+off+192(dst); \ - MOVL R9, 11*4+off+256(dst); \ - MOVL R9, 7*4+off+320(dst); \ - MOVL R9, 13*4+off+384(dst); \ - MOVL R9, 3*4+off+448(dst); \ - MOVL R9, 6*4+off+512(dst); \ - MOVL R9, 10*4+off+576(dst); \ - \ - MOVL R10, 2*4+off+0(dst); \ - MOVL R10, 1*4+off+64(dst); \ - MOVL R10, 15*4+off+128(dst); \ - MOVL R10, 10*4+off+192(dst); \ - MOVL R10, 6*4+off+256(dst); \ - MOVL R10, 8*4+off+320(dst); \ - MOVL R10, 3*4+off+384(dst); \ - MOVL R10, 13*4+off+448(dst); \ - MOVL R10, 14*4+off+512(dst); \ - MOVL R10, 5*4+off+576(dst); \ - SHRQ $32, R10; \ - MOVL R10, 6*4+off+0(dst); \ - MOVL R10, 11*4+off+64(dst); \ - MOVL R10, 2*4+off+128(dst); \ - MOVL R10, 9*4+off+192(dst); \ - MOVL R10, 1*4+off+256(dst); \ - MOVL R10, 13*4+off+320(dst); \ - MOVL R10, 4*4+off+384(dst); \ - MOVL R10, 8*4+off+448(dst); \ - MOVL R10, 15*4+off+512(dst); \ - MOVL R10, 7*4+off+576(dst); \ - \ - MOVL R11, 3*4+off+0(dst); \ - MOVL R11, 7*4+off+64(dst); \ - MOVL R11, 13*4+off+128(dst); \ - MOVL R11, 12*4+off+192(dst); \ - MOVL R11, 10*4+off+256(dst); \ - MOVL R11, 1*4+off+320(dst); \ - MOVL R11, 9*4+off+384(dst); \ - MOVL R11, 14*4+off+448(dst); \ - MOVL R11, 0*4+off+512(dst); \ - MOVL R11, 6*4+off+576(dst); \ - SHRQ $32, R11; \ - MOVL R11, 7*4+off+0(dst); \ - MOVL R11, 14*4+off+64(dst); \ - MOVL R11, 10*4+off+128(dst); \ - MOVL R11, 0*4+off+192(dst); \ - MOVL R11, 5*4+off+256(dst); \ - MOVL R11, 9*4+off+320(dst); \ - MOVL R11, 12*4+off+384(dst); \ - MOVL R11, 1*4+off+448(dst); \ - MOVL R11, 13*4+off+512(dst); \ - MOVL R11, 2*4+off+576(dst); \ - \ - MOVL R12, 8*4+off+0(dst); \ - MOVL R12, 5*4+off+64(dst); \ - MOVL R12, 4*4+off+128(dst); \ - MOVL R12, 15*4+off+192(dst); \ - MOVL R12, 14*4+off+256(dst); \ - MOVL R12, 3*4+off+320(dst); \ - MOVL R12, 11*4+off+384(dst); \ - MOVL R12, 10*4+off+448(dst); \ - MOVL R12, 7*4+off+512(dst); \ - MOVL R12, 1*4+off+576(dst); \ - SHRQ $32, R12; \ - MOVL R12, 12*4+off+0(dst); \ - MOVL R12, 2*4+off+64(dst); \ - MOVL R12, 11*4+off+128(dst); \ - MOVL R12, 4*4+off+192(dst); \ - MOVL R12, 0*4+off+256(dst); \ - MOVL R12, 15*4+off+320(dst); \ - MOVL R12, 10*4+off+384(dst); \ - MOVL R12, 7*4+off+448(dst); \ - MOVL R12, 5*4+off+512(dst); \ - MOVL R12, 9*4+off+576(dst); \ - \ - MOVL R13, 9*4+off+0(dst); \ - MOVL R13, 4*4+off+64(dst); \ - MOVL R13, 8*4+off+128(dst); \ - MOVL R13, 13*4+off+192(dst); \ - MOVL R13, 3*4+off+256(dst); \ - MOVL R13, 5*4+off+320(dst); \ - MOVL R13, 7*4+off+384(dst); \ - MOVL R13, 15*4+off+448(dst); \ - MOVL R13, 11*4+off+512(dst); \ - MOVL R13, 0*4+off+576(dst); \ - SHRQ $32, R13; \ - MOVL R13, 13*4+off+0(dst); \ - MOVL R13, 10*4+off+64(dst); \ - MOVL R13, 0*4+off+128(dst); \ - MOVL R13, 3*4+off+192(dst); \ - MOVL R13, 9*4+off+256(dst); \ - MOVL R13, 6*4+off+320(dst); \ - MOVL R13, 15*4+off+384(dst); \ - MOVL R13, 4*4+off+448(dst); \ - MOVL R13, 2*4+off+512(dst); \ - MOVL R13, 12*4+off+576(dst); \ - \ - MOVL R14, 10*4+off+0(dst); \ - MOVL R14, 12*4+off+64(dst); \ - MOVL R14, 1*4+off+128(dst); \ - MOVL R14, 6*4+off+192(dst); \ - MOVL R14, 13*4+off+256(dst); \ - MOVL R14, 4*4+off+320(dst); \ - MOVL R14, 0*4+off+384(dst); \ - MOVL R14, 2*4+off+448(dst); \ - MOVL R14, 8*4+off+512(dst); \ - MOVL R14, 14*4+off+576(dst); \ - SHRQ $32, R14; \ - MOVL R14, 14*4+off+0(dst); \ - MOVL R14, 3*4+off+64(dst); \ - MOVL R14, 7*4+off+128(dst); \ - MOVL R14, 2*4+off+192(dst); \ - MOVL R14, 15*4+off+256(dst); \ - MOVL R14, 12*4+off+320(dst); \ - MOVL R14, 6*4+off+384(dst); \ - MOVL R14, 0*4+off+448(dst); \ - MOVL R14, 9*4+off+512(dst); \ - MOVL R14, 11*4+off+576(dst); \ - \ - MOVL R15, 11*4+off+0(dst); \ - MOVL R15, 0*4+off+64(dst); \ - MOVL R15, 12*4+off+128(dst); \ - MOVL R15, 7*4+off+192(dst); \ - MOVL R15, 8*4+off+256(dst); \ - MOVL R15, 14*4+off+320(dst); \ - MOVL R15, 2*4+off+384(dst); \ - MOVL R15, 5*4+off+448(dst); \ - MOVL R15, 1*4+off+512(dst); \ - MOVL R15, 13*4+off+576(dst); \ - SHRQ $32, R15; \ - MOVL R15, 15*4+off+0(dst); \ - MOVL R15, 6*4+off+64(dst); \ - MOVL R15, 3*4+off+128(dst); \ - MOVL R15, 11*4+off+192(dst); \ - MOVL R15, 7*4+off+256(dst); \ - MOVL R15, 10*4+off+320(dst); \ - MOVL R15, 5*4+off+384(dst); \ - MOVL R15, 9*4+off+448(dst); \ - MOVL R15, 4*4+off+512(dst); \ - MOVL R15, 8*4+off+576(dst) +loop: + MOVO X0, X4 + MOVO X1, X5 + MOVO X2, X6 + MOVO X3, X7 + PADDQ X12, X15 + PXOR X15, X7 + MOVQ (SI), R8 + MOVQ 8(SI), R9 + MOVQ 16(SI), R10 + MOVQ 24(SI), R11 + MOVQ 32(SI), R12 + MOVQ 40(SI), R13 + MOVQ 48(SI), R14 + MOVQ 56(SI), R15 + MOVL R8, 16(BP) + MOVL R8, 116(BP) + MOVL R8, 164(BP) + MOVL R8, 264(BP) + MOVL R8, 288(BP) + MOVL R8, 344(BP) + MOVL R8, 432(BP) + MOVL R8, 512(BP) + MOVL R8, 540(BP) + MOVL R8, 652(BP) + SHRQ $0x20, R8 + MOVL R8, 32(BP) + MOVL R8, 112(BP) + MOVL R8, 200(BP) + MOVL R8, 228(BP) + MOVL R8, 320(BP) + MOVL R8, 380(BP) + MOVL R8, 404(BP) + MOVL R8, 488(BP) + MOVL R8, 568(BP) + MOVL R8, 604(BP) + MOVL R9, 20(BP) + MOVL R9, 132(BP) + MOVL R9, 168(BP) + MOVL R9, 240(BP) + MOVL R9, 280(BP) + MOVL R9, 336(BP) + MOVL R9, 456(BP) + MOVL R9, 508(BP) + MOVL R9, 576(BP) + MOVL R9, 608(BP) + SHRQ $0x20, R9 + MOVL R9, 36(BP) + MOVL R9, 140(BP) + MOVL R9, 180(BP) + MOVL R9, 212(BP) + MOVL R9, 316(BP) + MOVL R9, 364(BP) + MOVL R9, 452(BP) + MOVL R9, 476(BP) + MOVL R9, 552(BP) + MOVL R9, 632(BP) + MOVL R10, 24(BP) + MOVL R10, 84(BP) + MOVL R10, 204(BP) + MOVL R10, 248(BP) + MOVL R10, 296(BP) + MOVL R10, 368(BP) + MOVL R10, 412(BP) + MOVL R10, 516(BP) + MOVL R10, 584(BP) + MOVL R10, 612(BP) + SHRQ $0x20, R10 + MOVL R10, 40(BP) + MOVL R10, 124(BP) + MOVL R10, 152(BP) + MOVL R10, 244(BP) + MOVL R10, 276(BP) + MOVL R10, 388(BP) + MOVL R10, 416(BP) + MOVL R10, 496(BP) + MOVL R10, 588(BP) + MOVL R10, 620(BP) + MOVL R11, 28(BP) + MOVL R11, 108(BP) + MOVL R11, 196(BP) + MOVL R11, 256(BP) + MOVL R11, 312(BP) + MOVL R11, 340(BP) + MOVL R11, 436(BP) + MOVL R11, 520(BP) + MOVL R11, 528(BP) + MOVL R11, 616(BP) + SHRQ $0x20, R11 + MOVL R11, 44(BP) + MOVL R11, 136(BP) + MOVL R11, 184(BP) + MOVL R11, 208(BP) + MOVL R11, 292(BP) + MOVL R11, 372(BP) + MOVL R11, 448(BP) + MOVL R11, 468(BP) + MOVL R11, 580(BP) + MOVL R11, 600(BP) + MOVL R12, 48(BP) + MOVL R12, 100(BP) + MOVL R12, 160(BP) + MOVL R12, 268(BP) + MOVL R12, 328(BP) + MOVL R12, 348(BP) + MOVL R12, 444(BP) + MOVL R12, 504(BP) + MOVL R12, 556(BP) + MOVL R12, 596(BP) + SHRQ $0x20, R12 + MOVL R12, 64(BP) + MOVL R12, 88(BP) + MOVL R12, 188(BP) + MOVL R12, 224(BP) + MOVL R12, 272(BP) + MOVL R12, 396(BP) + MOVL R12, 440(BP) + MOVL R12, 492(BP) + MOVL R12, 548(BP) + MOVL R12, 628(BP) + MOVL R13, 52(BP) + MOVL R13, 96(BP) + MOVL R13, 176(BP) + MOVL R13, 260(BP) + MOVL R13, 284(BP) + MOVL R13, 356(BP) + MOVL R13, 428(BP) + MOVL R13, 524(BP) + MOVL R13, 572(BP) + MOVL R13, 592(BP) + SHRQ $0x20, R13 + MOVL R13, 68(BP) + MOVL R13, 120(BP) + MOVL R13, 144(BP) + MOVL R13, 220(BP) + MOVL R13, 308(BP) + MOVL R13, 360(BP) + MOVL R13, 460(BP) + MOVL R13, 480(BP) + MOVL R13, 536(BP) + MOVL R13, 640(BP) + MOVL R14, 56(BP) + MOVL R14, 128(BP) + MOVL R14, 148(BP) + MOVL R14, 232(BP) + MOVL R14, 324(BP) + MOVL R14, 352(BP) + MOVL R14, 400(BP) + MOVL R14, 472(BP) + MOVL R14, 560(BP) + MOVL R14, 648(BP) + SHRQ $0x20, R14 + MOVL R14, 72(BP) + MOVL R14, 92(BP) + MOVL R14, 172(BP) + MOVL R14, 216(BP) + MOVL R14, 332(BP) + MOVL R14, 384(BP) + MOVL R14, 424(BP) + MOVL R14, 464(BP) + MOVL R14, 564(BP) + MOVL R14, 636(BP) + MOVL R15, 60(BP) + MOVL R15, 80(BP) + MOVL R15, 192(BP) + MOVL R15, 236(BP) + MOVL R15, 304(BP) + MOVL R15, 392(BP) + MOVL R15, 408(BP) + MOVL R15, 484(BP) + MOVL R15, 532(BP) + MOVL R15, 644(BP) + SHRQ $0x20, R15 + MOVL R15, 76(BP) + MOVL R15, 104(BP) + MOVL R15, 156(BP) + MOVL R15, 252(BP) + MOVL R15, 300(BP) + MOVL R15, 376(BP) + MOVL R15, 420(BP) + MOVL R15, 500(BP) + MOVL R15, 544(BP) + MOVL R15, 624(BP) + PADDL 16(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 32(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 48(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 64(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 80(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 96(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 112(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 128(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 144(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 160(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 176(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 192(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 208(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 224(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 240(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 256(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 272(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 288(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 304(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 320(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 336(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 352(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 368(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 384(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 400(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 416(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 432(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 448(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 464(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 480(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 496(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 512(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 528(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 544(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 560(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 576(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 592(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 608(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 624(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x10, X8 + PSRLL $0x10, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 640(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + MOVO X7, X8 + PSLLL $0x18, X8 + PSRLL $0x08, X7 + PXOR X8, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PXOR X4, X0 + PXOR X5, X1 + PXOR X6, X0 + PXOR X7, X1 + LEAQ 64(SI), SI + SUBQ $0x40, DX + JNE loop + MOVO X15, (BP) + MOVQ (BP), R9 + MOVQ R9, (BX) + MOVOU X0, (AX) + MOVOU X1, 16(AX) + RET -#define BLAKE2s_SSE2() \ - PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ - ROUND_SSE2(X4, X5, X6, X7, 16(BP), 32(BP), 48(BP), 64(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+64(BP), 32+64(BP), 48+64(BP), 64+64(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+128(BP), 32+128(BP), 48+128(BP), 64+128(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+192(BP), 32+192(BP), 48+192(BP), 64+192(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+256(BP), 32+256(BP), 48+256(BP), 64+256(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+320(BP), 32+320(BP), 48+320(BP), 64+320(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+384(BP), 32+384(BP), 48+384(BP), 64+384(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+448(BP), 32+448(BP), 48+448(BP), 64+448(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+512(BP), 32+512(BP), 48+512(BP), 64+512(BP), X8); \ - ROUND_SSE2(X4, X5, X6, X7, 16+576(BP), 32+576(BP), 48+576(BP), 64+576(BP), X8) +DATA iv0<>+0(SB)/4, $0x6a09e667 +DATA iv0<>+4(SB)/4, $0xbb67ae85 +DATA iv0<>+8(SB)/4, $0x3c6ef372 +DATA iv0<>+12(SB)/4, $0xa54ff53a +GLOBL iv0<>(SB), RODATA|NOPTR, $16 -#define BLAKE2s_SSSE3() \ - PRECOMPUTE_MSG(BP, 16, SI, R8, R9, R10, R11, R12, R13, R14, R15); \ - ROUND_SSSE3(X4, X5, X6, X7, 16(BP), 32(BP), 48(BP), 64(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+64(BP), 32+64(BP), 48+64(BP), 64+64(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+128(BP), 32+128(BP), 48+128(BP), 64+128(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+192(BP), 32+192(BP), 48+192(BP), 64+192(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+256(BP), 32+256(BP), 48+256(BP), 64+256(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+320(BP), 32+320(BP), 48+320(BP), 64+320(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+384(BP), 32+384(BP), 48+384(BP), 64+384(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+448(BP), 32+448(BP), 48+448(BP), 64+448(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+512(BP), 32+512(BP), 48+512(BP), 64+512(BP), X8, X13, X14); \ - ROUND_SSSE3(X4, X5, X6, X7, 16+576(BP), 32+576(BP), 48+576(BP), 64+576(BP), X8, X13, X14) +DATA iv1<>+0(SB)/4, $0x510e527f +DATA iv1<>+4(SB)/4, $0x9b05688c +DATA iv1<>+8(SB)/4, $0x1f83d9ab +DATA iv1<>+12(SB)/4, $0x5be0cd19 +GLOBL iv1<>(SB), RODATA|NOPTR, $16 -#define BLAKE2s_SSE4() \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 0, 2, 4, 6, 1, 3, 5, 7, 8, 10, 12, 14, 9, 11, 13, 15); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 14, 4, 9, 13, 10, 8, 15, 6, 1, 0, 11, 5, 12, 2, 7, 3); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 11, 12, 5, 15, 8, 0, 2, 13, 10, 3, 7, 9, 14, 6, 1, 4); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 7, 3, 13, 11, 9, 1, 12, 14, 2, 5, 4, 15, 6, 10, 0, 8); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 9, 5, 2, 10, 0, 7, 4, 15, 14, 11, 6, 3, 1, 12, 8, 13); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 2, 6, 0, 8, 12, 10, 11, 3, 4, 7, 15, 1, 13, 5, 14, 9); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 12, 1, 14, 4, 5, 15, 13, 10, 0, 6, 9, 8, 7, 3, 2, 11); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 13, 7, 12, 3, 11, 14, 1, 9, 5, 15, 8, 2, 0, 4, 6, 10); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 6, 14, 11, 0, 15, 9, 3, 8, 12, 13, 1, 10, 2, 7, 4, 5); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14); \ - LOAD_MSG_SSE4(X8, X9, X10, X11, SI, 10, 8, 7, 1, 2, 4, 6, 5, 15, 9, 3, 13, 11, 14, 12, 0); \ - ROUND_SSSE3(X4, X5, X6, X7, X8, X9, X10, X11, X8, X13, X14) +DATA counter<>+0(SB)/8, $0x0000000000000040 +DATA counter<>+8(SB)/8, $0x0000000000000000 +GLOBL counter<>(SB), RODATA|NOPTR, $16 -#define HASH_BLOCKS(h, c, flag, blocks_base, blocks_len, BLAKE2s_FUNC) \ - MOVQ h, AX; \ - MOVQ c, BX; \ - MOVL flag, CX; \ - MOVQ blocks_base, SI; \ - MOVQ blocks_len, DX; \ - \ - MOVQ SP, BP; \ - ADDQ $15, BP; \ - ANDQ $~15, BP; \ - \ - MOVQ 0(BX), R9; \ - MOVQ R9, 0(BP); \ - MOVQ CX, 8(BP); \ - \ - MOVOU 0(AX), X0; \ - MOVOU 16(AX), X1; \ - MOVOU iv0<>(SB), X2; \ - MOVOU iv1<>(SB), X3 \ - \ - MOVOU counter<>(SB), X12; \ - MOVOU rol16<>(SB), X13; \ - MOVOU rol8<>(SB), X14; \ - MOVO 0(BP), X15; \ - \ - loop: \ - MOVO X0, X4; \ - MOVO X1, X5; \ - MOVO X2, X6; \ - MOVO X3, X7; \ - \ - PADDQ X12, X15; \ - PXOR X15, X7; \ - \ - BLAKE2s_FUNC(); \ - \ - PXOR X4, X0; \ - PXOR X5, X1; \ - PXOR X6, X0; \ - PXOR X7, X1; \ - \ - LEAQ 64(SI), SI; \ - SUBQ $64, DX; \ - JNE loop; \ - \ - MOVO X15, 0(BP); \ - MOVQ 0(BP), R9; \ - MOVQ R9, 0(BX); \ - \ - MOVOU X0, 0(AX); \ - MOVOU X1, 16(AX) +DATA rol16<>+0(SB)/8, $0x0504070601000302 +DATA rol16<>+8(SB)/8, $0x0d0c0f0e09080b0a +GLOBL rol16<>(SB), RODATA|NOPTR, $16 -// func hashBlocksSSE2(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSE2(SB), 0, $672-48 // frame = 656 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE2) - RET +DATA rol8<>+0(SB)/8, $0x0407060500030201 +DATA rol8<>+8(SB)/8, $0x0c0f0e0d080b0a09 +GLOBL rol8<>(SB), RODATA|NOPTR, $16 // func hashBlocksSSSE3(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSSE3(SB), 0, $672-48 // frame = 656 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSSE3) +// Requires: SSE2, SSSE3 +TEXT ·hashBlocksSSSE3(SB), $672-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVL flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DX + MOVQ SP, BP + ADDQ $0x0f, BP + ANDQ $-16, BP + MOVQ (BX), R9 + MOVQ R9, (BP) + MOVQ CX, 8(BP) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU iv0<>+0(SB), X2 + MOVOU iv1<>+0(SB), X3 + MOVOU counter<>+0(SB), X12 + MOVOU rol16<>+0(SB), X13 + MOVOU rol8<>+0(SB), X14 + MOVO (BP), X15 + +loop: + MOVO X0, X4 + MOVO X1, X5 + MOVO X2, X6 + MOVO X3, X7 + PADDQ X12, X15 + PXOR X15, X7 + MOVQ (SI), R8 + MOVQ 8(SI), R9 + MOVQ 16(SI), R10 + MOVQ 24(SI), R11 + MOVQ 32(SI), R12 + MOVQ 40(SI), R13 + MOVQ 48(SI), R14 + MOVQ 56(SI), R15 + MOVL R8, 16(BP) + MOVL R8, 116(BP) + MOVL R8, 164(BP) + MOVL R8, 264(BP) + MOVL R8, 288(BP) + MOVL R8, 344(BP) + MOVL R8, 432(BP) + MOVL R8, 512(BP) + MOVL R8, 540(BP) + MOVL R8, 652(BP) + SHRQ $0x20, R8 + MOVL R8, 32(BP) + MOVL R8, 112(BP) + MOVL R8, 200(BP) + MOVL R8, 228(BP) + MOVL R8, 320(BP) + MOVL R8, 380(BP) + MOVL R8, 404(BP) + MOVL R8, 488(BP) + MOVL R8, 568(BP) + MOVL R8, 604(BP) + MOVL R9, 20(BP) + MOVL R9, 132(BP) + MOVL R9, 168(BP) + MOVL R9, 240(BP) + MOVL R9, 280(BP) + MOVL R9, 336(BP) + MOVL R9, 456(BP) + MOVL R9, 508(BP) + MOVL R9, 576(BP) + MOVL R9, 608(BP) + SHRQ $0x20, R9 + MOVL R9, 36(BP) + MOVL R9, 140(BP) + MOVL R9, 180(BP) + MOVL R9, 212(BP) + MOVL R9, 316(BP) + MOVL R9, 364(BP) + MOVL R9, 452(BP) + MOVL R9, 476(BP) + MOVL R9, 552(BP) + MOVL R9, 632(BP) + MOVL R10, 24(BP) + MOVL R10, 84(BP) + MOVL R10, 204(BP) + MOVL R10, 248(BP) + MOVL R10, 296(BP) + MOVL R10, 368(BP) + MOVL R10, 412(BP) + MOVL R10, 516(BP) + MOVL R10, 584(BP) + MOVL R10, 612(BP) + SHRQ $0x20, R10 + MOVL R10, 40(BP) + MOVL R10, 124(BP) + MOVL R10, 152(BP) + MOVL R10, 244(BP) + MOVL R10, 276(BP) + MOVL R10, 388(BP) + MOVL R10, 416(BP) + MOVL R10, 496(BP) + MOVL R10, 588(BP) + MOVL R10, 620(BP) + MOVL R11, 28(BP) + MOVL R11, 108(BP) + MOVL R11, 196(BP) + MOVL R11, 256(BP) + MOVL R11, 312(BP) + MOVL R11, 340(BP) + MOVL R11, 436(BP) + MOVL R11, 520(BP) + MOVL R11, 528(BP) + MOVL R11, 616(BP) + SHRQ $0x20, R11 + MOVL R11, 44(BP) + MOVL R11, 136(BP) + MOVL R11, 184(BP) + MOVL R11, 208(BP) + MOVL R11, 292(BP) + MOVL R11, 372(BP) + MOVL R11, 448(BP) + MOVL R11, 468(BP) + MOVL R11, 580(BP) + MOVL R11, 600(BP) + MOVL R12, 48(BP) + MOVL R12, 100(BP) + MOVL R12, 160(BP) + MOVL R12, 268(BP) + MOVL R12, 328(BP) + MOVL R12, 348(BP) + MOVL R12, 444(BP) + MOVL R12, 504(BP) + MOVL R12, 556(BP) + MOVL R12, 596(BP) + SHRQ $0x20, R12 + MOVL R12, 64(BP) + MOVL R12, 88(BP) + MOVL R12, 188(BP) + MOVL R12, 224(BP) + MOVL R12, 272(BP) + MOVL R12, 396(BP) + MOVL R12, 440(BP) + MOVL R12, 492(BP) + MOVL R12, 548(BP) + MOVL R12, 628(BP) + MOVL R13, 52(BP) + MOVL R13, 96(BP) + MOVL R13, 176(BP) + MOVL R13, 260(BP) + MOVL R13, 284(BP) + MOVL R13, 356(BP) + MOVL R13, 428(BP) + MOVL R13, 524(BP) + MOVL R13, 572(BP) + MOVL R13, 592(BP) + SHRQ $0x20, R13 + MOVL R13, 68(BP) + MOVL R13, 120(BP) + MOVL R13, 144(BP) + MOVL R13, 220(BP) + MOVL R13, 308(BP) + MOVL R13, 360(BP) + MOVL R13, 460(BP) + MOVL R13, 480(BP) + MOVL R13, 536(BP) + MOVL R13, 640(BP) + MOVL R14, 56(BP) + MOVL R14, 128(BP) + MOVL R14, 148(BP) + MOVL R14, 232(BP) + MOVL R14, 324(BP) + MOVL R14, 352(BP) + MOVL R14, 400(BP) + MOVL R14, 472(BP) + MOVL R14, 560(BP) + MOVL R14, 648(BP) + SHRQ $0x20, R14 + MOVL R14, 72(BP) + MOVL R14, 92(BP) + MOVL R14, 172(BP) + MOVL R14, 216(BP) + MOVL R14, 332(BP) + MOVL R14, 384(BP) + MOVL R14, 424(BP) + MOVL R14, 464(BP) + MOVL R14, 564(BP) + MOVL R14, 636(BP) + MOVL R15, 60(BP) + MOVL R15, 80(BP) + MOVL R15, 192(BP) + MOVL R15, 236(BP) + MOVL R15, 304(BP) + MOVL R15, 392(BP) + MOVL R15, 408(BP) + MOVL R15, 484(BP) + MOVL R15, 532(BP) + MOVL R15, 644(BP) + SHRQ $0x20, R15 + MOVL R15, 76(BP) + MOVL R15, 104(BP) + MOVL R15, 156(BP) + MOVL R15, 252(BP) + MOVL R15, 300(BP) + MOVL R15, 376(BP) + MOVL R15, 420(BP) + MOVL R15, 500(BP) + MOVL R15, 544(BP) + MOVL R15, 624(BP) + PADDL 16(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 32(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 48(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 64(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 80(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 96(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 112(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 128(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 144(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 160(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 176(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 192(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 208(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 224(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 240(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 256(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 272(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 288(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 304(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 320(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 336(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 352(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 368(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 384(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 400(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 416(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 432(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 448(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 464(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 480(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 496(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 512(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 528(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 544(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 560(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 576(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PADDL 592(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 608(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL 624(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL 640(BP), X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PXOR X4, X0 + PXOR X5, X1 + PXOR X6, X0 + PXOR X7, X1 + LEAQ 64(SI), SI + SUBQ $0x40, DX + JNE loop + MOVO X15, (BP) + MOVQ (BP), R9 + MOVQ R9, (BX) + MOVOU X0, (AX) + MOVOU X1, 16(AX) RET // func hashBlocksSSE4(h *[8]uint32, c *[2]uint32, flag uint32, blocks []byte) -TEXT ·hashBlocksSSE4(SB), 0, $32-48 // frame = 16 + 16 byte alignment - HASH_BLOCKS(h+0(FP), c+8(FP), flag+16(FP), blocks_base+24(FP), blocks_len+32(FP), BLAKE2s_SSE4) +// Requires: SSE2, SSE4.1, SSSE3 +TEXT ·hashBlocksSSE4(SB), $32-48 + MOVQ h+0(FP), AX + MOVQ c+8(FP), BX + MOVL flag+16(FP), CX + MOVQ blocks_base+24(FP), SI + MOVQ blocks_len+32(FP), DX + MOVQ SP, BP + ADDQ $0x0f, BP + ANDQ $-16, BP + MOVQ (BX), R9 + MOVQ R9, (BP) + MOVQ CX, 8(BP) + MOVOU (AX), X0 + MOVOU 16(AX), X1 + MOVOU iv0<>+0(SB), X2 + MOVOU iv1<>+0(SB), X3 + MOVOU counter<>+0(SB), X12 + MOVOU rol16<>+0(SB), X13 + MOVOU rol8<>+0(SB), X14 + MOVO (BP), X15 + +loop: + MOVO X0, X4 + MOVO X1, X5 + MOVO X2, X6 + MOVO X3, X7 + PADDQ X12, X15 + PXOR X15, X7 + MOVL (SI), X8 + PINSRD $0x01, 8(SI), X8 + PINSRD $0x02, 16(SI), X8 + PINSRD $0x03, 24(SI), X8 + MOVL 4(SI), X9 + PINSRD $0x01, 12(SI), X9 + PINSRD $0x02, 20(SI), X9 + PINSRD $0x03, 28(SI), X9 + MOVL 32(SI), X10 + PINSRD $0x01, 40(SI), X10 + PINSRD $0x02, 48(SI), X10 + PINSRD $0x03, 56(SI), X10 + MOVL 36(SI), X11 + PINSRD $0x01, 44(SI), X11 + PINSRD $0x02, 52(SI), X11 + PINSRD $0x03, 60(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 56(SI), X8 + PINSRD $0x01, 16(SI), X8 + PINSRD $0x02, 36(SI), X8 + PINSRD $0x03, 52(SI), X8 + MOVL 40(SI), X9 + PINSRD $0x01, 32(SI), X9 + PINSRD $0x02, 60(SI), X9 + PINSRD $0x03, 24(SI), X9 + MOVL 4(SI), X10 + PINSRD $0x01, (SI), X10 + PINSRD $0x02, 44(SI), X10 + PINSRD $0x03, 20(SI), X10 + MOVL 48(SI), X11 + PINSRD $0x01, 8(SI), X11 + PINSRD $0x02, 28(SI), X11 + PINSRD $0x03, 12(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 44(SI), X8 + PINSRD $0x01, 48(SI), X8 + PINSRD $0x02, 20(SI), X8 + PINSRD $0x03, 60(SI), X8 + MOVL 32(SI), X9 + PINSRD $0x01, (SI), X9 + PINSRD $0x02, 8(SI), X9 + PINSRD $0x03, 52(SI), X9 + MOVL 40(SI), X10 + PINSRD $0x01, 12(SI), X10 + PINSRD $0x02, 28(SI), X10 + PINSRD $0x03, 36(SI), X10 + MOVL 56(SI), X11 + PINSRD $0x01, 24(SI), X11 + PINSRD $0x02, 4(SI), X11 + PINSRD $0x03, 16(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 28(SI), X8 + PINSRD $0x01, 12(SI), X8 + PINSRD $0x02, 52(SI), X8 + PINSRD $0x03, 44(SI), X8 + MOVL 36(SI), X9 + PINSRD $0x01, 4(SI), X9 + PINSRD $0x02, 48(SI), X9 + PINSRD $0x03, 56(SI), X9 + MOVL 8(SI), X10 + PINSRD $0x01, 20(SI), X10 + PINSRD $0x02, 16(SI), X10 + PINSRD $0x03, 60(SI), X10 + MOVL 24(SI), X11 + PINSRD $0x01, 40(SI), X11 + PINSRD $0x02, (SI), X11 + PINSRD $0x03, 32(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 36(SI), X8 + PINSRD $0x01, 20(SI), X8 + PINSRD $0x02, 8(SI), X8 + PINSRD $0x03, 40(SI), X8 + MOVL (SI), X9 + PINSRD $0x01, 28(SI), X9 + PINSRD $0x02, 16(SI), X9 + PINSRD $0x03, 60(SI), X9 + MOVL 56(SI), X10 + PINSRD $0x01, 44(SI), X10 + PINSRD $0x02, 24(SI), X10 + PINSRD $0x03, 12(SI), X10 + MOVL 4(SI), X11 + PINSRD $0x01, 48(SI), X11 + PINSRD $0x02, 32(SI), X11 + PINSRD $0x03, 52(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 8(SI), X8 + PINSRD $0x01, 24(SI), X8 + PINSRD $0x02, (SI), X8 + PINSRD $0x03, 32(SI), X8 + MOVL 48(SI), X9 + PINSRD $0x01, 40(SI), X9 + PINSRD $0x02, 44(SI), X9 + PINSRD $0x03, 12(SI), X9 + MOVL 16(SI), X10 + PINSRD $0x01, 28(SI), X10 + PINSRD $0x02, 60(SI), X10 + PINSRD $0x03, 4(SI), X10 + MOVL 52(SI), X11 + PINSRD $0x01, 20(SI), X11 + PINSRD $0x02, 56(SI), X11 + PINSRD $0x03, 36(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 48(SI), X8 + PINSRD $0x01, 4(SI), X8 + PINSRD $0x02, 56(SI), X8 + PINSRD $0x03, 16(SI), X8 + MOVL 20(SI), X9 + PINSRD $0x01, 60(SI), X9 + PINSRD $0x02, 52(SI), X9 + PINSRD $0x03, 40(SI), X9 + MOVL (SI), X10 + PINSRD $0x01, 24(SI), X10 + PINSRD $0x02, 36(SI), X10 + PINSRD $0x03, 32(SI), X10 + MOVL 28(SI), X11 + PINSRD $0x01, 12(SI), X11 + PINSRD $0x02, 8(SI), X11 + PINSRD $0x03, 44(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 52(SI), X8 + PINSRD $0x01, 28(SI), X8 + PINSRD $0x02, 48(SI), X8 + PINSRD $0x03, 12(SI), X8 + MOVL 44(SI), X9 + PINSRD $0x01, 56(SI), X9 + PINSRD $0x02, 4(SI), X9 + PINSRD $0x03, 36(SI), X9 + MOVL 20(SI), X10 + PINSRD $0x01, 60(SI), X10 + PINSRD $0x02, 32(SI), X10 + PINSRD $0x03, 8(SI), X10 + MOVL (SI), X11 + PINSRD $0x01, 16(SI), X11 + PINSRD $0x02, 24(SI), X11 + PINSRD $0x03, 40(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 24(SI), X8 + PINSRD $0x01, 56(SI), X8 + PINSRD $0x02, 44(SI), X8 + PINSRD $0x03, (SI), X8 + MOVL 60(SI), X9 + PINSRD $0x01, 36(SI), X9 + PINSRD $0x02, 12(SI), X9 + PINSRD $0x03, 32(SI), X9 + MOVL 48(SI), X10 + PINSRD $0x01, 52(SI), X10 + PINSRD $0x02, 4(SI), X10 + PINSRD $0x03, 40(SI), X10 + MOVL 8(SI), X11 + PINSRD $0x01, 28(SI), X11 + PINSRD $0x02, 16(SI), X11 + PINSRD $0x03, 20(SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + MOVL 40(SI), X8 + PINSRD $0x01, 32(SI), X8 + PINSRD $0x02, 28(SI), X8 + PINSRD $0x03, 4(SI), X8 + MOVL 8(SI), X9 + PINSRD $0x01, 16(SI), X9 + PINSRD $0x02, 24(SI), X9 + PINSRD $0x03, 20(SI), X9 + MOVL 60(SI), X10 + PINSRD $0x01, 36(SI), X10 + PINSRD $0x02, 12(SI), X10 + PINSRD $0x03, 52(SI), X10 + MOVL 44(SI), X11 + PINSRD $0x01, 56(SI), X11 + PINSRD $0x02, 48(SI), X11 + PINSRD $0x03, (SI), X11 + PADDL X8, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X9, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X5, X5 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X7, X7 + PADDL X10, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X13, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x14, X8 + PSRLL $0x0c, X5 + PXOR X8, X5 + PADDL X11, X4 + PADDL X5, X4 + PXOR X4, X7 + PSHUFB X14, X7 + PADDL X7, X6 + PXOR X6, X5 + MOVO X5, X8 + PSLLL $0x19, X8 + PSRLL $0x07, X5 + PXOR X8, X5 + PSHUFL $0x39, X7, X7 + PSHUFL $0x4e, X6, X6 + PSHUFL $0x93, X5, X5 + PXOR X4, X0 + PXOR X5, X1 + PXOR X6, X0 + PXOR X7, X1 + LEAQ 64(SI), SI + SUBQ $0x40, DX + JNE loop + MOVO X15, (BP) + MOVQ (BP), R9 + MOVQ R9, (BX) + MOVOU X0, (AX) + MOVOU X1, 16(AX) RET diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s index 731d2ac6db..fd5ee845f9 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305_amd64.s @@ -1,2715 +1,9762 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// This file was originally from https://golang.org/cl/24717 by Vlad Krasnov of CloudFlare. +// Code generated by command: go run chacha20poly1305_amd64_asm.go -out ../chacha20poly1305_amd64.s -pkg chacha20poly1305. DO NOT EDIT. //go:build gc && !purego #include "textflag.h" -// General register allocation -#define oup DI -#define inp SI -#define inl BX -#define adp CX // free to reuse, after we hash the additional data -#define keyp R8 // free to reuse, when we copy the key to stack -#define itr2 R9 // general iterator -#define itr1 CX // general iterator -#define acc0 R10 -#define acc1 R11 -#define acc2 R12 -#define t0 R13 -#define t1 R14 -#define t2 R15 -#define t3 R8 -// Register and stack allocation for the SSE code -#define rStore (0*16)(BP) -#define sStore (1*16)(BP) -#define state1Store (2*16)(BP) -#define state2Store (3*16)(BP) -#define tmpStore (4*16)(BP) -#define ctr0Store (5*16)(BP) -#define ctr1Store (6*16)(BP) -#define ctr2Store (7*16)(BP) -#define ctr3Store (8*16)(BP) -#define A0 X0 -#define A1 X1 -#define A2 X2 -#define B0 X3 -#define B1 X4 -#define B2 X5 -#define C0 X6 -#define C1 X7 -#define C2 X8 -#define D0 X9 -#define D1 X10 -#define D2 X11 -#define T0 X12 -#define T1 X13 -#define T2 X14 -#define T3 X15 -#define A3 T0 -#define B3 T1 -#define C3 T2 -#define D3 T3 -// Register and stack allocation for the AVX2 code -#define rsStoreAVX2 (0*32)(BP) -#define state1StoreAVX2 (1*32)(BP) -#define state2StoreAVX2 (2*32)(BP) -#define ctr0StoreAVX2 (3*32)(BP) -#define ctr1StoreAVX2 (4*32)(BP) -#define ctr2StoreAVX2 (5*32)(BP) -#define ctr3StoreAVX2 (6*32)(BP) -#define tmpStoreAVX2 (7*32)(BP) // 256 bytes on stack -#define AA0 Y0 -#define AA1 Y5 -#define AA2 Y6 -#define AA3 Y7 -#define BB0 Y14 -#define BB1 Y9 -#define BB2 Y10 -#define BB3 Y11 -#define CC0 Y12 -#define CC1 Y13 -#define CC2 Y8 -#define CC3 Y15 -#define DD0 Y4 -#define DD1 Y1 -#define DD2 Y2 -#define DD3 Y3 -#define TT0 DD3 -#define TT1 AA3 -#define TT2 BB3 -#define TT3 CC3 -// ChaCha20 constants -DATA ·chacha20Constants<>+0x00(SB)/4, $0x61707865 -DATA ·chacha20Constants<>+0x04(SB)/4, $0x3320646e -DATA ·chacha20Constants<>+0x08(SB)/4, $0x79622d32 -DATA ·chacha20Constants<>+0x0c(SB)/4, $0x6b206574 -DATA ·chacha20Constants<>+0x10(SB)/4, $0x61707865 -DATA ·chacha20Constants<>+0x14(SB)/4, $0x3320646e -DATA ·chacha20Constants<>+0x18(SB)/4, $0x79622d32 -DATA ·chacha20Constants<>+0x1c(SB)/4, $0x6b206574 -// <<< 16 with PSHUFB -DATA ·rol16<>+0x00(SB)/8, $0x0504070601000302 -DATA ·rol16<>+0x08(SB)/8, $0x0D0C0F0E09080B0A -DATA ·rol16<>+0x10(SB)/8, $0x0504070601000302 -DATA ·rol16<>+0x18(SB)/8, $0x0D0C0F0E09080B0A -// <<< 8 with PSHUFB -DATA ·rol8<>+0x00(SB)/8, $0x0605040702010003 -DATA ·rol8<>+0x08(SB)/8, $0x0E0D0C0F0A09080B -DATA ·rol8<>+0x10(SB)/8, $0x0605040702010003 -DATA ·rol8<>+0x18(SB)/8, $0x0E0D0C0F0A09080B - -DATA ·avx2InitMask<>+0x00(SB)/8, $0x0 -DATA ·avx2InitMask<>+0x08(SB)/8, $0x0 -DATA ·avx2InitMask<>+0x10(SB)/8, $0x1 -DATA ·avx2InitMask<>+0x18(SB)/8, $0x0 - -DATA ·avx2IncMask<>+0x00(SB)/8, $0x2 -DATA ·avx2IncMask<>+0x08(SB)/8, $0x0 -DATA ·avx2IncMask<>+0x10(SB)/8, $0x2 -DATA ·avx2IncMask<>+0x18(SB)/8, $0x0 -// Poly1305 key clamp -DATA ·polyClampMask<>+0x00(SB)/8, $0x0FFFFFFC0FFFFFFF -DATA ·polyClampMask<>+0x08(SB)/8, $0x0FFFFFFC0FFFFFFC -DATA ·polyClampMask<>+0x10(SB)/8, $0xFFFFFFFFFFFFFFFF -DATA ·polyClampMask<>+0x18(SB)/8, $0xFFFFFFFFFFFFFFFF - -DATA ·sseIncMask<>+0x00(SB)/8, $0x1 -DATA ·sseIncMask<>+0x08(SB)/8, $0x0 -// To load/store the last < 16 bytes in a buffer -DATA ·andMask<>+0x00(SB)/8, $0x00000000000000ff -DATA ·andMask<>+0x08(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x10(SB)/8, $0x000000000000ffff -DATA ·andMask<>+0x18(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x20(SB)/8, $0x0000000000ffffff -DATA ·andMask<>+0x28(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x30(SB)/8, $0x00000000ffffffff -DATA ·andMask<>+0x38(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x40(SB)/8, $0x000000ffffffffff -DATA ·andMask<>+0x48(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x50(SB)/8, $0x0000ffffffffffff -DATA ·andMask<>+0x58(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x60(SB)/8, $0x00ffffffffffffff -DATA ·andMask<>+0x68(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x70(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x78(SB)/8, $0x0000000000000000 -DATA ·andMask<>+0x80(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x88(SB)/8, $0x00000000000000ff -DATA ·andMask<>+0x90(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0x98(SB)/8, $0x000000000000ffff -DATA ·andMask<>+0xa0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xa8(SB)/8, $0x0000000000ffffff -DATA ·andMask<>+0xb0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xb8(SB)/8, $0x00000000ffffffff -DATA ·andMask<>+0xc0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xc8(SB)/8, $0x000000ffffffffff -DATA ·andMask<>+0xd0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xd8(SB)/8, $0x0000ffffffffffff -DATA ·andMask<>+0xe0(SB)/8, $0xffffffffffffffff -DATA ·andMask<>+0xe8(SB)/8, $0x00ffffffffffffff - -GLOBL ·chacha20Constants<>(SB), (NOPTR+RODATA), $32 -GLOBL ·rol16<>(SB), (NOPTR+RODATA), $32 -GLOBL ·rol8<>(SB), (NOPTR+RODATA), $32 -GLOBL ·sseIncMask<>(SB), (NOPTR+RODATA), $16 -GLOBL ·avx2IncMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·avx2InitMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·polyClampMask<>(SB), (NOPTR+RODATA), $32 -GLOBL ·andMask<>(SB), (NOPTR+RODATA), $240 -// No PALIGNR in Go ASM yet (but VPALIGNR is present). -#define shiftB0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X3, X3 -#define shiftB1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x04 // PALIGNR $4, X4, X4 -#define shiftB2Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X5, X5 -#define shiftB3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x04 // PALIGNR $4, X13, X13 -#define shiftC0Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X6, X6 -#define shiftC1Left BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x08 // PALIGNR $8, X7, X7 -#define shiftC2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc0; BYTE $0x08 // PALIGNR $8, X8, X8 -#define shiftC3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xf6; BYTE $0x08 // PALIGNR $8, X14, X14 -#define shiftD0Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x0c // PALIGNR $12, X9, X9 -#define shiftD1Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x0c // PALIGNR $12, X10, X10 -#define shiftD2Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X11, X11 -#define shiftD3Left BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x0c // PALIGNR $12, X15, X15 -#define shiftB0Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x0c // PALIGNR $12, X3, X3 -#define shiftB1Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xe4; BYTE $0x0c // PALIGNR $12, X4, X4 -#define shiftB2Right BYTE $0x66; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X5, X5 -#define shiftB3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xed; BYTE $0x0c // PALIGNR $12, X13, X13 -#define shiftC0Right shiftC0Left -#define shiftC1Right shiftC1Left -#define shiftC2Right shiftC2Left -#define shiftC3Right shiftC3Left -#define shiftD0Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xc9; BYTE $0x04 // PALIGNR $4, X9, X9 -#define shiftD1Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xd2; BYTE $0x04 // PALIGNR $4, X10, X10 -#define shiftD2Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xdb; BYTE $0x04 // PALIGNR $4, X11, X11 -#define shiftD3Right BYTE $0x66; BYTE $0x45; BYTE $0x0f; BYTE $0x3a; BYTE $0x0f; BYTE $0xff; BYTE $0x04 // PALIGNR $4, X15, X15 - -// Some macros - -// ROL rotates the uint32s in register R left by N bits, using temporary T. -#define ROL(N, R, T) \ - MOVO R, T; PSLLL $(N), T; PSRLL $(32-(N)), R; PXOR T, R - -// ROL16 rotates the uint32s in register R left by 16, using temporary T if needed. -#ifdef GOAMD64_v2 -#define ROL16(R, T) PSHUFB ·rol16<>(SB), R -#else -#define ROL16(R, T) ROL(16, R, T) -#endif - -// ROL8 rotates the uint32s in register R left by 8, using temporary T if needed. -#ifdef GOAMD64_v2 -#define ROL8(R, T) PSHUFB ·rol8<>(SB), R -#else -#define ROL8(R, T) ROL(8, R, T) -#endif - -#define chachaQR(A, B, C, D, T) \ - PADDD B, A; PXOR A, D; ROL16(D, T) \ - PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $12, T; PSRLL $20, B; PXOR T, B \ - PADDD B, A; PXOR A, D; ROL8(D, T) \ - PADDD D, C; PXOR C, B; MOVO B, T; PSLLL $7, T; PSRLL $25, B; PXOR T, B - -#define chachaQR_AVX2(A, B, C, D, T) \ - VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol16<>(SB), D, D \ - VPADDD D, C, C; VPXOR C, B, B; VPSLLD $12, B, T; VPSRLD $20, B, B; VPXOR T, B, B \ - VPADDD B, A, A; VPXOR A, D, D; VPSHUFB ·rol8<>(SB), D, D \ - VPADDD D, C, C; VPXOR C, B, B; VPSLLD $7, B, T; VPSRLD $25, B, B; VPXOR T, B, B - -#define polyAdd(S) ADDQ S, acc0; ADCQ 8+S, acc1; ADCQ $1, acc2 -#define polyMulStage1 MOVQ (0*8)(BP), AX; MOVQ AX, t2; MULQ acc0; MOVQ AX, t0; MOVQ DX, t1; MOVQ (0*8)(BP), AX; MULQ acc1; IMULQ acc2, t2; ADDQ AX, t1; ADCQ DX, t2 -#define polyMulStage2 MOVQ (1*8)(BP), AX; MOVQ AX, t3; MULQ acc0; ADDQ AX, t1; ADCQ $0, DX; MOVQ DX, acc0; MOVQ (1*8)(BP), AX; MULQ acc1; ADDQ AX, t2; ADCQ $0, DX -#define polyMulStage3 IMULQ acc2, t3; ADDQ acc0, t2; ADCQ DX, t3 -#define polyMulReduceStage MOVQ t0, acc0; MOVQ t1, acc1; MOVQ t2, acc2; ANDQ $3, acc2; MOVQ t2, t0; ANDQ $-4, t0; MOVQ t3, t1; SHRQ $2, t3, t2; SHRQ $2, t3; ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $0, acc2; ADDQ t2, acc0; ADCQ t3, acc1; ADCQ $0, acc2 - -#define polyMulStage1_AVX2 MOVQ (0*8)(BP), DX; MOVQ DX, t2; MULXQ acc0, t0, t1; IMULQ acc2, t2; MULXQ acc1, AX, DX; ADDQ AX, t1; ADCQ DX, t2 -#define polyMulStage2_AVX2 MOVQ (1*8)(BP), DX; MULXQ acc0, acc0, AX; ADDQ acc0, t1; MULXQ acc1, acc1, t3; ADCQ acc1, t2; ADCQ $0, t3 -#define polyMulStage3_AVX2 IMULQ acc2, DX; ADDQ AX, t2; ADCQ DX, t3 - -#define polyMul polyMulStage1; polyMulStage2; polyMulStage3; polyMulReduceStage -#define polyMulAVX2 polyMulStage1_AVX2; polyMulStage2_AVX2; polyMulStage3_AVX2; polyMulReduceStage -// ---------------------------------------------------------------------------- + +// func polyHashADInternal<>() TEXT polyHashADInternal<>(SB), NOSPLIT, $0 - // adp points to beginning of additional data - // itr2 holds ad length - XORQ acc0, acc0 - XORQ acc1, acc1 - XORQ acc2, acc2 - CMPQ itr2, $13 - JNE hashADLoop - -openFastTLSAD: - // Special treatment for the TLS case of 13 bytes - MOVQ (adp), acc0 - MOVQ 5(adp), acc1 - SHRQ $24, acc1 - MOVQ $1, acc2 - polyMul + // Hack: Must declare #define macros inside of a function due to Avo constraints + // ROL rotates the uint32s in register R left by N bits, using temporary T. + #define ROL(N, R, T) \ + MOVO R, T; \ + PSLLL $(N), T; \ + PSRLL $(32-(N)), R; \ + PXOR T, R + + // ROL8 rotates the uint32s in register R left by 8, using temporary T if needed. + #ifdef GOAMD64_v2 + #define ROL8(R, T) PSHUFB ·rol8<>(SB), R + #else + #define ROL8(R, T) ROL(8, R, T) + #endif + + // ROL16 rotates the uint32s in register R left by 16, using temporary T if needed. + #ifdef GOAMD64_v2 + #define ROL16(R, T) PSHUFB ·rol16<>(SB), R + #else + #define ROL16(R, T) ROL(16, R, T) + #endif + XORQ R10, R10 + XORQ R11, R11 + XORQ R12, R12 + CMPQ R9, $0x0d + JNE hashADLoop + MOVQ (CX), R10 + MOVQ 5(CX), R11 + SHRQ $0x18, R11 + MOVQ $0x00000001, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 RET hashADLoop: // Hash in 16 byte chunks - CMPQ itr2, $16 - JB hashADTail - polyAdd(0(adp)) - LEAQ (1*16)(adp), adp - SUBQ $16, itr2 - polyMul - JMP hashADLoop + CMPQ R9, $0x10 + JB hashADTail + ADDQ (CX), R10 + ADCQ 8(CX), R11 + ADCQ $0x01, R12 + LEAQ 16(CX), CX + SUBQ $0x10, R9 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + JMP hashADLoop hashADTail: - CMPQ itr2, $0 + CMPQ R9, $0x00 JE hashADDone // Hash last < 16 byte tail - XORQ t0, t0 - XORQ t1, t1 - XORQ t2, t2 - ADDQ itr2, adp + XORQ R13, R13 + XORQ R14, R14 + XORQ R15, R15 + ADDQ R9, CX hashADTailLoop: - SHLQ $8, t0, t1 - SHLQ $8, t0 - MOVB -1(adp), t2 - XORQ t2, t0 - DECQ adp - DECQ itr2 - JNE hashADTailLoop - -hashADTailFinish: - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - - // Finished AD + SHLQ $0x08, R13, R14 + SHLQ $0x08, R13 + MOVB -1(CX), R15 + XORQ R15, R13 + DECQ CX + DECQ R9 + JNE hashADTailLoop + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + hashADDone: RET -// ---------------------------------------------------------------------------- -// func chacha20Poly1305Open(dst, key, src, ad []byte) bool -TEXT ·chacha20Poly1305Open(SB), 0, $288-97 +// func chacha20Poly1305Open(dst []byte, key []uint32, src []byte, ad []byte) bool +// Requires: AVX, AVX2, BMI2, CMOV, SSE2 +TEXT ·chacha20Poly1305Open(SB), $288-97 // For aligned stack access MOVQ SP, BP - ADDQ $32, BP + ADDQ $0x20, BP ANDQ $-32, BP - MOVQ dst+0(FP), oup - MOVQ key+24(FP), keyp - MOVQ src+48(FP), inp - MOVQ src_len+56(FP), inl - MOVQ ad+72(FP), adp + MOVQ dst_base+0(FP), DI + MOVQ key_base+24(FP), R8 + MOVQ src_base+48(FP), SI + MOVQ src_len+56(FP), BX + MOVQ ad_base+72(FP), CX // Check for AVX2 support - CMPB ·useAVX2(SB), $1 + CMPB ·useAVX2+0(SB), $0x01 JE chacha20Poly1305Open_AVX2 // Special optimization, for very short buffers - CMPQ inl, $128 - JBE openSSE128 // About 16% faster + CMPQ BX, $0x80 + JBE openSSE128 // For long buffers, prepare the poly key first - MOVOU ·chacha20Constants<>(SB), A0 - MOVOU (1*16)(keyp), B0 - MOVOU (2*16)(keyp), C0 - MOVOU (3*16)(keyp), D0 - MOVO D0, T1 + MOVOU ·chacha20Constants<>+0(SB), X0 + MOVOU 16(R8), X3 + MOVOU 32(R8), X6 + MOVOU 48(R8), X9 + MOVO X9, X13 // Store state on stack for future use - MOVO B0, state1Store - MOVO C0, state2Store - MOVO D0, ctr3Store - MOVQ $10, itr2 + MOVO X3, 32(BP) + MOVO X6, 48(BP) + MOVO X9, 128(BP) + MOVQ $0x0000000a, R9 openSSEPreparePolyKey: - chachaQR(A0, B0, C0, D0, T0) - shiftB0Left; shiftC0Left; shiftD0Left - chachaQR(A0, B0, C0, D0, T0) - shiftB0Right; shiftC0Right; shiftD0Right - DECQ itr2 - JNE openSSEPreparePolyKey + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + DECQ R9 + JNE openSSEPreparePolyKey // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0 + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL 32(BP), X3 // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVO A0, rStore; MOVO B0, sStore + PAND ·polyClampMask<>+0(SB), X0 + MOVO X0, (BP) + MOVO X3, 16(BP) // Hash AAD - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) openSSEMainLoop: - CMPQ inl, $256 + CMPQ BX, $0x00000100 JB openSSEMainLoopDone // Load state, increment counter blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X2, X12 + MOVO X5, X13 + MOVO X8, X14 + MOVO X11, X15 + PADDL ·sseIncMask<>+0(SB), X15 // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVO X9, 80(BP) + MOVO X10, 96(BP) + MOVO X11, 112(BP) + MOVO X15, 128(BP) - // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash 2 blocks, and for the remaining 4 only 1 block - for a total of 16 - MOVQ $4, itr1 - MOVQ inp, itr2 + // There are 10 ChaCha20 iterations of 2QR each, so for 6 iterations we hash + // 2 blocks, and for the remaining 4 only 1 block - for a total of 16 + MOVQ $0x00000004, CX + MOVQ SI, R9 openSSEInternalLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyAdd(0(itr2)) - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - LEAQ (2*8)(itr2), itr2 - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - polyMulStage3 - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr1 - JGE openSSEInternalLoop - - polyAdd(0(itr2)) - polyMul - LEAQ (2*8)(itr2), itr2 - - CMPQ itr1, $-6 - JG openSSEInternalLoop + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x0c + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + LEAQ 16(R9), R9 + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x04 + DECQ CX + JGE openSSEInternalLoop + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(R9), R9 + CMPQ CX, $-6 + JG openSSEInternalLoop // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + PADDD ·chacha20Constants<>+0(SB), X0 + PADDD ·chacha20Constants<>+0(SB), X1 + PADDD ·chacha20Constants<>+0(SB), X2 + PADDD ·chacha20Constants<>+0(SB), X12 + PADDD 32(BP), X3 + PADDD 32(BP), X4 + PADDD 32(BP), X5 + PADDD 32(BP), X13 + PADDD 48(BP), X6 + PADDD 48(BP), X7 + PADDD 48(BP), X8 + PADDD 48(BP), X14 + PADDD 80(BP), X9 + PADDD 96(BP), X10 + PADDD 112(BP), X11 + PADDD 128(BP), X15 // Load - xor - store - MOVO D3, tmpStore - MOVOU (0*16)(inp), D3; PXOR D3, A0; MOVOU A0, (0*16)(oup) - MOVOU (1*16)(inp), D3; PXOR D3, B0; MOVOU B0, (1*16)(oup) - MOVOU (2*16)(inp), D3; PXOR D3, C0; MOVOU C0, (2*16)(oup) - MOVOU (3*16)(inp), D3; PXOR D3, D0; MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), D0; PXOR D0, A1; MOVOU A1, (4*16)(oup) - MOVOU (5*16)(inp), D0; PXOR D0, B1; MOVOU B1, (5*16)(oup) - MOVOU (6*16)(inp), D0; PXOR D0, C1; MOVOU C1, (6*16)(oup) - MOVOU (7*16)(inp), D0; PXOR D0, D1; MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), D0; PXOR D0, A2; MOVOU A2, (8*16)(oup) - MOVOU (9*16)(inp), D0; PXOR D0, B2; MOVOU B2, (9*16)(oup) - MOVOU (10*16)(inp), D0; PXOR D0, C2; MOVOU C2, (10*16)(oup) - MOVOU (11*16)(inp), D0; PXOR D0, D2; MOVOU D2, (11*16)(oup) - MOVOU (12*16)(inp), D0; PXOR D0, A3; MOVOU A3, (12*16)(oup) - MOVOU (13*16)(inp), D0; PXOR D0, B3; MOVOU B3, (13*16)(oup) - MOVOU (14*16)(inp), D0; PXOR D0, C3; MOVOU C3, (14*16)(oup) - MOVOU (15*16)(inp), D0; PXOR tmpStore, D0; MOVOU D0, (15*16)(oup) - LEAQ 256(inp), inp - LEAQ 256(oup), oup - SUBQ $256, inl + MOVO X15, 64(BP) + MOVOU (SI), X15 + PXOR X15, X0 + MOVOU X0, (DI) + MOVOU 16(SI), X15 + PXOR X15, X3 + MOVOU X3, 16(DI) + MOVOU 32(SI), X15 + PXOR X15, X6 + MOVOU X6, 32(DI) + MOVOU 48(SI), X15 + PXOR X15, X9 + MOVOU X9, 48(DI) + MOVOU 64(SI), X9 + PXOR X9, X1 + MOVOU X1, 64(DI) + MOVOU 80(SI), X9 + PXOR X9, X4 + MOVOU X4, 80(DI) + MOVOU 96(SI), X9 + PXOR X9, X7 + MOVOU X7, 96(DI) + MOVOU 112(SI), X9 + PXOR X9, X10 + MOVOU X10, 112(DI) + MOVOU 128(SI), X9 + PXOR X9, X2 + MOVOU X2, 128(DI) + MOVOU 144(SI), X9 + PXOR X9, X5 + MOVOU X5, 144(DI) + MOVOU 160(SI), X9 + PXOR X9, X8 + MOVOU X8, 160(DI) + MOVOU 176(SI), X9 + PXOR X9, X11 + MOVOU X11, 176(DI) + MOVOU 192(SI), X9 + PXOR X9, X12 + MOVOU X12, 192(DI) + MOVOU 208(SI), X9 + PXOR X9, X13 + MOVOU X13, 208(DI) + MOVOU 224(SI), X9 + PXOR X9, X14 + MOVOU X14, 224(DI) + MOVOU 240(SI), X9 + PXOR 64(BP), X9 + MOVOU X9, 240(DI) + LEAQ 256(SI), SI + LEAQ 256(DI), DI + SUBQ $0x00000100, BX JMP openSSEMainLoop openSSEMainLoopDone: // Handle the various tail sizes efficiently - TESTQ inl, inl + TESTQ BX, BX JE openSSEFinalize - CMPQ inl, $64 + CMPQ BX, $0x40 JBE openSSETail64 - CMPQ inl, $128 + CMPQ BX, $0x80 JBE openSSETail128 - CMPQ inl, $192 + CMPQ BX, $0xc0 JBE openSSETail192 JMP openSSETail256 openSSEFinalize: // Hash in the PT, AAD lengths - ADDQ ad_len+80(FP), acc0; ADCQ src_len+56(FP), acc1; ADCQ $1, acc2 - polyMul + ADDQ ad_len+80(FP), R10 + ADCQ src_len+56(FP), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Final reduce - MOVQ acc0, t0 - MOVQ acc1, t1 - MOVQ acc2, t2 - SUBQ $-5, acc0 - SBBQ $-1, acc1 - SBBQ $3, acc2 - CMOVQCS t0, acc0 - CMOVQCS t1, acc1 - CMOVQCS t2, acc2 + MOVQ R10, R13 + MOVQ R11, R14 + MOVQ R12, R15 + SUBQ $-5, R10 + SBBQ $-1, R11 + SBBQ $0x03, R12 + CMOVQCS R13, R10 + CMOVQCS R14, R11 + CMOVQCS R15, R12 // Add in the "s" part of the key - ADDQ 0+sStore, acc0 - ADCQ 8+sStore, acc1 + ADDQ 16(BP), R10 + ADCQ 24(BP), R11 // Finally, constant time compare to the tag at the end of the message XORQ AX, AX - MOVQ $1, DX - XORQ (0*8)(inp), acc0 - XORQ (1*8)(inp), acc1 - ORQ acc1, acc0 + MOVQ $0x00000001, DX + XORQ (SI), R10 + XORQ 8(SI), R11 + ORQ R11, R10 CMOVQEQ DX, AX // Return true iff tags are equal MOVB AX, ret+96(FP) RET -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 129 bytes openSSE128: - // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks - MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 - MOVQ $10, itr2 + MOVOU ·chacha20Constants<>+0(SB), X0 + MOVOU 16(R8), X3 + MOVOU 32(R8), X6 + MOVOU 48(R8), X9 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X3, X13 + MOVO X6, X14 + MOVO X10, X15 + MOVQ $0x0000000a, R9 openSSE128InnerCipherLoop: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftB1Left; shiftB2Left - shiftC0Left; shiftC1Left; shiftC2Left - shiftD0Left; shiftD1Left; shiftD2Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftB1Right; shiftB2Right - shiftC0Right; shiftC1Right; shiftC2Right - shiftD0Right; shiftD1Right; shiftD2Right - DECQ itr2 - JNE openSSE128InnerCipherLoop + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + DECQ R9 + JNE openSSE128InnerCipherLoop // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 - PADDL T2, C1; PADDL T2, C2 - PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL ·chacha20Constants<>+0(SB), X2 + PADDL X13, X3 + PADDL X13, X4 + PADDL X13, X5 + PADDL X14, X7 + PADDL X14, X8 + PADDL X15, X10 + PADDL ·sseIncMask<>+0(SB), X15 + PADDL X15, X11 // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVOU A0, rStore; MOVOU B0, sStore + PAND ·polyClampMask<>+0(SB), X0 + MOVOU X0, (BP) + MOVOU X3, 16(BP) // Hash - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) openSSE128Open: - CMPQ inl, $16 + CMPQ BX, $0x10 JB openSSETail16 - SUBQ $16, inl + SUBQ $0x10, BX // Load for hashing - polyAdd(0(inp)) + ADDQ (SI), R10 + ADCQ 8(SI), R11 + ADCQ $0x01, R12 // Load for decryption - MOVOU (inp), T0; PXOR T0, A1; MOVOU A1, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - polyMul + MOVOU (SI), X12 + PXOR X12, X1 + MOVOU X1, (DI) + LEAQ 16(SI), SI + LEAQ 16(DI), DI + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Shift the stream "left" - MOVO B1, A1 - MOVO C1, B1 - MOVO D1, C1 - MOVO A2, D1 - MOVO B2, A2 - MOVO C2, B2 - MOVO D2, C2 + MOVO X4, X1 + MOVO X7, X4 + MOVO X10, X7 + MOVO X2, X10 + MOVO X5, X2 + MOVO X8, X5 + MOVO X11, X8 JMP openSSE128Open openSSETail16: - TESTQ inl, inl + TESTQ BX, BX JE openSSEFinalize // We can safely load the CT from the end, because it is padded with the MAC - MOVQ inl, itr2 - SHLQ $4, itr2 - LEAQ ·andMask<>(SB), t0 - MOVOU (inp), T0 - ADDQ inl, inp - PAND -16(t0)(itr2*1), T0 - MOVO T0, 0+tmpStore - MOVQ T0, t0 - MOVQ 8+tmpStore, t1 - PXOR A1, T0 + MOVQ BX, R9 + SHLQ $0x04, R9 + LEAQ ·andMask<>+0(SB), R13 + MOVOU (SI), X12 + ADDQ BX, SI + PAND -16(R13)(R9*1), X12 + MOVO X12, 64(BP) + MOVQ X12, R13 + MOVQ 72(BP), R14 + PXOR X1, X12 // We can only store one byte at a time, since plaintext can be shorter than 16 bytes openSSETail16Store: - MOVQ T0, t3 - MOVB t3, (oup) - PSRLDQ $1, T0 - INCQ oup - DECQ inl + MOVQ X12, R8 + MOVB R8, (DI) + PSRLDQ $0x01, X12 + INCQ DI + DECQ BX JNE openSSETail16Store - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 JMP openSSEFinalize -// ---------------------------------------------------------------------------- -// Special optimization for the last 64 bytes of ciphertext openSSETail64: - // Need to decrypt up to 64 bytes - prepare single block - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - XORQ itr2, itr2 - MOVQ inl, itr1 - CMPQ itr1, $16 - JB openSSETail64LoopB + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X9, 80(BP) + XORQ R9, R9 + MOVQ BX, CX + CMPQ CX, $0x10 + JB openSSETail64LoopB openSSETail64LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul - SUBQ $16, itr1 + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + SUBQ $0x10, CX openSSETail64LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0) - shiftB0Left; shiftC0Left; shiftD0Left - chachaQR(A0, B0, C0, D0, T0) - shiftB0Right; shiftC0Right; shiftD0Right - - CMPQ itr1, $16 - JAE openSSETail64LoopA - - CMPQ itr2, $160 - JNE openSSETail64LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL state1Store, B0; PADDL state2Store, C0; PADDL ctr0Store, D0 + ADDQ $0x10, R9 + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + CMPQ CX, $0x10 + JAE openSSETail64LoopA + CMPQ R9, $0xa0 + JNE openSSETail64LoopB + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL 32(BP), X3 + PADDL 48(BP), X6 + PADDL 80(BP), X9 openSSETail64DecLoop: - CMPQ inl, $16 + CMPQ BX, $0x10 JB openSSETail64DecLoopDone - SUBQ $16, inl - MOVOU (inp), T0 - PXOR T0, A0 - MOVOU A0, (oup) - LEAQ 16(inp), inp - LEAQ 16(oup), oup - MOVO B0, A0 - MOVO C0, B0 - MOVO D0, C0 + SUBQ $0x10, BX + MOVOU (SI), X12 + PXOR X12, X0 + MOVOU X0, (DI) + LEAQ 16(SI), SI + LEAQ 16(DI), DI + MOVO X3, X0 + MOVO X6, X3 + MOVO X9, X6 JMP openSSETail64DecLoop openSSETail64DecLoopDone: - MOVO A0, A1 + MOVO X0, X1 JMP openSSETail16 -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext openSSETail128: - // Need to decrypt up to 128 bytes - prepare two blocks - MOVO ·chacha20Constants<>(SB), A1; MOVO state1Store, B1; MOVO state2Store, C1; MOVO ctr3Store, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr0Store - MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr1Store - XORQ itr2, itr2 - MOVQ inl, itr1 - ANDQ $-16, itr1 + MOVO ·chacha20Constants<>+0(SB), X1 + MOVO 32(BP), X4 + MOVO 48(BP), X7 + MOVO 128(BP), X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X10, 80(BP) + MOVO X1, X0 + MOVO X4, X3 + MOVO X7, X6 + MOVO X10, X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X9, 96(BP) + XORQ R9, R9 + MOVQ BX, CX + ANDQ $-16, CX openSSETail128LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 openSSETail128LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - - CMPQ itr2, itr1 - JB openSSETail128LoopA - - CMPQ itr2, $160 - JNE openSSETail128LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B0; PADDL state1Store, B1 - PADDL state2Store, C0; PADDL state2Store, C1 - PADDL ctr1Store, D0; PADDL ctr0Store, D1 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) - - SUBQ $64, inl - LEAQ 64(inp), inp - LEAQ 64(oup), oup - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 192 bytes of ciphertext + ADDQ $0x10, R9 + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + CMPQ R9, CX + JB openSSETail128LoopA + CMPQ R9, $0xa0 + JNE openSSETail128LoopB + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL 32(BP), X3 + PADDL 32(BP), X4 + PADDL 48(BP), X6 + PADDL 48(BP), X7 + PADDL 96(BP), X9 + PADDL 80(BP), X10 + MOVOU (SI), X12 + MOVOU 16(SI), X13 + MOVOU 32(SI), X14 + MOVOU 48(SI), X15 + PXOR X12, X1 + PXOR X13, X4 + PXOR X14, X7 + PXOR X15, X10 + MOVOU X1, (DI) + MOVOU X4, 16(DI) + MOVOU X7, 32(DI) + MOVOU X10, 48(DI) + SUBQ $0x40, BX + LEAQ 64(SI), SI + LEAQ 64(DI), DI + JMP openSSETail64DecLoop + openSSETail192: - // Need to decrypt up to 192 bytes - prepare three blocks - MOVO ·chacha20Constants<>(SB), A2; MOVO state1Store, B2; MOVO state2Store, C2; MOVO ctr3Store, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr0Store - MOVO A2, A1; MOVO B2, B1; MOVO C2, C1; MOVO D2, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store - MOVO A1, A0; MOVO B1, B0; MOVO C1, C0; MOVO D1, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr2Store - - MOVQ inl, itr1 - MOVQ $160, itr2 - CMPQ itr1, $160 - CMOVQGT itr2, itr1 - ANDQ $-16, itr1 - XORQ itr2, itr2 + MOVO ·chacha20Constants<>+0(SB), X2 + MOVO 32(BP), X5 + MOVO 48(BP), X8 + MOVO 128(BP), X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X11, 80(BP) + MOVO X2, X1 + MOVO X5, X4 + MOVO X8, X7 + MOVO X11, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X10, 96(BP) + MOVO X1, X0 + MOVO X4, X3 + MOVO X7, X6 + MOVO X10, X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X9, 112(BP) + MOVQ BX, CX + MOVQ $0x000000a0, R9 + CMPQ CX, $0xa0 + CMOVQGT R9, CX + ANDQ $-16, CX + XORQ R9, R9 openSSLTail192LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMul + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 openSSLTail192LoopB: - ADDQ $16, itr2 - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - shiftB2Left; shiftC2Left; shiftD2Left - - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - shiftB2Right; shiftC2Right; shiftD2Right - - CMPQ itr2, itr1 - JB openSSLTail192LoopA - - CMPQ itr2, $160 - JNE openSSLTail192LoopB - - CMPQ inl, $176 - JB openSSLTail192Store - - polyAdd(160(inp)) - polyMul - - CMPQ inl, $192 - JB openSSLTail192Store - - polyAdd(176(inp)) - polyMul + ADDQ $0x10, R9 + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + CMPQ R9, CX + JB openSSLTail192LoopA + CMPQ R9, $0xa0 + JNE openSSLTail192LoopB + CMPQ BX, $0xb0 + JB openSSLTail192Store + ADDQ 160(SI), R10 + ADCQ 168(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + CMPQ BX, $0xc0 + JB openSSLTail192Store + ADDQ 176(SI), R10 + ADCQ 184(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 openSSLTail192Store: - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 - PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 - PADDL ctr2Store, D0; PADDL ctr1Store, D1; PADDL ctr0Store, D2 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A2; PXOR T1, B2; PXOR T2, C2; PXOR T3, D2 - MOVOU A2, (0*16)(oup); MOVOU B2, (1*16)(oup); MOVOU C2, (2*16)(oup); MOVOU D2, (3*16)(oup) - - MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - - SUBQ $128, inl - LEAQ 128(inp), inp - LEAQ 128(oup), oup - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL ·chacha20Constants<>+0(SB), X2 + PADDL 32(BP), X3 + PADDL 32(BP), X4 + PADDL 32(BP), X5 + PADDL 48(BP), X6 + PADDL 48(BP), X7 + PADDL 48(BP), X8 + PADDL 112(BP), X9 + PADDL 96(BP), X10 + PADDL 80(BP), X11 + MOVOU (SI), X12 + MOVOU 16(SI), X13 + MOVOU 32(SI), X14 + MOVOU 48(SI), X15 + PXOR X12, X2 + PXOR X13, X5 + PXOR X14, X8 + PXOR X15, X11 + MOVOU X2, (DI) + MOVOU X5, 16(DI) + MOVOU X8, 32(DI) + MOVOU X11, 48(DI) + MOVOU 64(SI), X12 + MOVOU 80(SI), X13 + MOVOU 96(SI), X14 + MOVOU 112(SI), X15 + PXOR X12, X1 + PXOR X13, X4 + PXOR X14, X7 + PXOR X15, X10 + MOVOU X1, 64(DI) + MOVOU X4, 80(DI) + MOVOU X7, 96(DI) + MOVOU X10, 112(DI) + SUBQ $0x80, BX + LEAQ 128(SI), SI + LEAQ 128(DI), DI + JMP openSSETail64DecLoop + openSSETail256: - // Need to decrypt up to 256 bytes - prepare four blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X2, X12 + MOVO X5, X13 + MOVO X8, X14 + MOVO X11, X15 + PADDL ·sseIncMask<>+0(SB), X15 // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - XORQ itr2, itr2 + MOVO X9, 80(BP) + MOVO X10, 96(BP) + MOVO X11, 112(BP) + MOVO X15, 128(BP) + XORQ R9, R9 openSSETail256Loop: - // This loop inteleaves 8 ChaCha quarter rounds with 1 poly multiplication - polyAdd(0(inp)(itr2*1)) - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulStage3 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - ADDQ $2*8, itr2 - CMPQ itr2, $160 - JB openSSETail256Loop - MOVQ inl, itr1 - ANDQ $-16, itr1 + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x0c + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x04 + ADDQ $0x10, R9 + CMPQ R9, $0xa0 + JB openSSETail256Loop + MOVQ BX, CX + ANDQ $-16, CX openSSETail256HashLoop: - polyAdd(0(inp)(itr2*1)) - polyMul - ADDQ $2*8, itr2 - CMPQ itr2, itr1 - JB openSSETail256HashLoop + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ $0x10, R9 + CMPQ R9, CX + JB openSSETail256HashLoop // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - MOVO D3, tmpStore + PADDD ·chacha20Constants<>+0(SB), X0 + PADDD ·chacha20Constants<>+0(SB), X1 + PADDD ·chacha20Constants<>+0(SB), X2 + PADDD ·chacha20Constants<>+0(SB), X12 + PADDD 32(BP), X3 + PADDD 32(BP), X4 + PADDD 32(BP), X5 + PADDD 32(BP), X13 + PADDD 48(BP), X6 + PADDD 48(BP), X7 + PADDD 48(BP), X8 + PADDD 48(BP), X14 + PADDD 80(BP), X9 + PADDD 96(BP), X10 + PADDD 112(BP), X11 + PADDD 128(BP), X15 + MOVO X15, 64(BP) // Load - xor - store - MOVOU (0*16)(inp), D3; PXOR D3, A0 - MOVOU (1*16)(inp), D3; PXOR D3, B0 - MOVOU (2*16)(inp), D3; PXOR D3, C0 - MOVOU (3*16)(inp), D3; PXOR D3, D0 - MOVOU A0, (0*16)(oup) - MOVOU B0, (1*16)(oup) - MOVOU C0, (2*16)(oup) - MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) - LEAQ 192(inp), inp - LEAQ 192(oup), oup - SUBQ $192, inl - MOVO A3, A0 - MOVO B3, B0 - MOVO C3, C0 - MOVO tmpStore, D0 - - JMP openSSETail64DecLoop - -// ---------------------------------------------------------------------------- -// ------------------------- AVX2 Code ---------------------------------------- + MOVOU (SI), X15 + PXOR X15, X0 + MOVOU 16(SI), X15 + PXOR X15, X3 + MOVOU 32(SI), X15 + PXOR X15, X6 + MOVOU 48(SI), X15 + PXOR X15, X9 + MOVOU X0, (DI) + MOVOU X3, 16(DI) + MOVOU X6, 32(DI) + MOVOU X9, 48(DI) + MOVOU 64(SI), X0 + MOVOU 80(SI), X3 + MOVOU 96(SI), X6 + MOVOU 112(SI), X9 + PXOR X0, X1 + PXOR X3, X4 + PXOR X6, X7 + PXOR X9, X10 + MOVOU X1, 64(DI) + MOVOU X4, 80(DI) + MOVOU X7, 96(DI) + MOVOU X10, 112(DI) + MOVOU 128(SI), X0 + MOVOU 144(SI), X3 + MOVOU 160(SI), X6 + MOVOU 176(SI), X9 + PXOR X0, X2 + PXOR X3, X5 + PXOR X6, X8 + PXOR X9, X11 + MOVOU X2, 128(DI) + MOVOU X5, 144(DI) + MOVOU X8, 160(DI) + MOVOU X11, 176(DI) + LEAQ 192(SI), SI + LEAQ 192(DI), DI + SUBQ $0xc0, BX + MOVO X12, X0 + MOVO X13, X3 + MOVO X14, X6 + MOVO 64(BP), X9 + JMP openSSETail64DecLoop + chacha20Poly1305Open_AVX2: VZEROUPPER - VMOVDQU ·chacha20Constants<>(SB), AA0 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 - BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 - VPADDD ·avx2InitMask<>(SB), DD0, DD0 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + BYTE $0xc4 + BYTE $0x42 + BYTE $0x7d + BYTE $0x5a + BYTE $0x70 + BYTE $0x10 + BYTE $0xc4 + BYTE $0x42 + BYTE $0x7d + BYTE $0x5a + BYTE $0x60 + BYTE $0x20 + BYTE $0xc4 + BYTE $0xc2 + BYTE $0x7d + BYTE $0x5a + BYTE $0x60 + BYTE $0x30 + VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 // Special optimization, for very short buffers - CMPQ inl, $192 + CMPQ BX, $0xc0 JBE openAVX2192 - CMPQ inl, $320 + CMPQ BX, $0x00000140 JBE openAVX2320 // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream - VMOVDQA BB0, state1StoreAVX2 - VMOVDQA CC0, state2StoreAVX2 - VMOVDQA DD0, ctr3StoreAVX2 - MOVQ $10, itr2 + VMOVDQA Y14, 32(BP) + VMOVDQA Y12, 64(BP) + VMOVDQA Y4, 192(BP) + MOVQ $0x0000000a, R9 openAVX2PreparePolyKey: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - DECQ itr2 - JNE openAVX2PreparePolyKey - - VPADDD ·chacha20Constants<>(SB), AA0, AA0 - VPADDD state1StoreAVX2, BB0, BB0 - VPADDD state2StoreAVX2, CC0, CC0 - VPADDD ctr3StoreAVX2, DD0, DD0 - - VPERM2I128 $0x02, AA0, BB0, TT0 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x04, Y4, Y4, Y4 + DECQ R9 + JNE openAVX2PreparePolyKey + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD 32(BP), Y14, Y14 + VPADDD 64(BP), Y12, Y12 + VPADDD 192(BP), Y4, Y4 + VPERM2I128 $0x02, Y0, Y14, Y3 // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 + VPAND ·polyClampMask<>+0(SB), Y3, Y3 + VMOVDQA Y3, (BP) // Stream for the first 64 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 + VPERM2I128 $0x13, Y0, Y14, Y0 + VPERM2I128 $0x13, Y12, Y4, Y14 // Hash AD + first 64 bytes - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 + XORQ CX, CX openAVX2InitialHash64: - polyAdd(0(inp)(itr1*1)) - polyMulAVX2 - ADDQ $16, itr1 - CMPQ itr1, $64 - JNE openAVX2InitialHash64 + ADDQ (SI)(CX*1), R10 + ADCQ 8(SI)(CX*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ $0x10, CX + CMPQ CX, $0x40 + JNE openAVX2InitialHash64 // Decrypt the first 64 bytes - VPXOR (0*32)(inp), AA0, AA0 - VPXOR (1*32)(inp), BB0, BB0 - VMOVDQU AA0, (0*32)(oup) - VMOVDQU BB0, (1*32)(oup) - LEAQ (2*32)(inp), inp - LEAQ (2*32)(oup), oup - SUBQ $64, inl + VPXOR (SI), Y0, Y0 + VPXOR 32(SI), Y14, Y14 + VMOVDQU Y0, (DI) + VMOVDQU Y14, 32(DI) + LEAQ 64(SI), SI + LEAQ 64(DI), DI + SUBQ $0x40, BX openAVX2MainLoop: - CMPQ inl, $512 + CMPQ BX, $0x00000200 JB openAVX2MainLoopDone // Load state, increment counter blocks, store the incremented counters - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - XORQ itr1, itr1 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) + XORQ CX, CX openAVX2InternalLoop: - // Lets just say this spaghetti loop interleaves 2 quarter rounds with 3 poly multiplications - // Effectively per 512 bytes of stream we hash 480 bytes of ciphertext - polyAdd(0*8(inp)(itr1*1)) - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage1_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulStage2_AVX2 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyMulStage3_AVX2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - polyAdd(2*8(inp)(itr1*1)) - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage1_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage2_AVX2 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage3_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulReduceStage - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(4*8(inp)(itr1*1)) - LEAQ (6*8)(itr1), itr1 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage1_AVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - polyMulStage2_AVX2 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage3_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - CMPQ itr1, $480 + ADDQ (SI)(CX*1), R10 + ADCQ 8(SI)(CX*1), R11 + ADCQ $0x01, R12 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + ADDQ 16(SI)(CX*1), R10 + ADCQ 24(SI)(CX*1), R11 + ADCQ $0x01, R12 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x0c, Y3, Y3, Y3 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + ADDQ 32(SI)(CX*1), R10 + ADCQ 40(SI)(CX*1), R11 + ADCQ $0x01, R12 + LEAQ 48(CX), CX + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x04, Y3, Y3, Y3 + CMPQ CX, $0x000001e0 JNE openAVX2InternalLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD ·chacha20Constants<>+0(SB), Y7, Y7 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 32(BP), Y11, Y11 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 64(BP), Y15, Y15 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPADDD 192(BP), Y3, Y3 + VMOVDQA Y15, 224(BP) // We only hashed 480 of the 512 bytes available - hash the remaining 32 here - polyAdd(480(inp)) - polyMulAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + ADDQ 480(SI), R10 + ADCQ 488(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPERM2I128 $0x02, Y0, Y14, Y15 + VPERM2I128 $0x13, Y0, Y14, Y14 + VPERM2I128 $0x02, Y12, Y4, Y0 + VPERM2I128 $0x13, Y12, Y4, Y12 + VPXOR (SI), Y15, Y15 + VPXOR 32(SI), Y0, Y0 + VPXOR 64(SI), Y14, Y14 + VPXOR 96(SI), Y12, Y12 + VMOVDQU Y15, (DI) + VMOVDQU Y0, 32(DI) + VMOVDQU Y14, 64(DI) + VMOVDQU Y12, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR 128(SI), Y0, Y0 + VPXOR 160(SI), Y14, Y14 + VPXOR 192(SI), Y12, Y12 + VPXOR 224(SI), Y4, Y4 + VMOVDQU Y0, 128(DI) + VMOVDQU Y14, 160(DI) + VMOVDQU Y12, 192(DI) + VMOVDQU Y4, 224(DI) // and here - polyAdd(496(inp)) - polyMulAVX2 - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 - VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) - LEAQ (32*16)(inp), inp - LEAQ (32*16)(oup), oup - SUBQ $(32*16), inl + ADDQ 496(SI), R10 + ADCQ 504(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + VPXOR 256(SI), Y0, Y0 + VPXOR 288(SI), Y14, Y14 + VPXOR 320(SI), Y12, Y12 + VPXOR 352(SI), Y4, Y4 + VMOVDQU Y0, 256(DI) + VMOVDQU Y14, 288(DI) + VMOVDQU Y12, 320(DI) + VMOVDQU Y4, 352(DI) + VPERM2I128 $0x02, Y7, Y11, Y0 + VPERM2I128 $0x02, 224(BP), Y3, Y14 + VPERM2I128 $0x13, Y7, Y11, Y12 + VPERM2I128 $0x13, 224(BP), Y3, Y4 + VPXOR 384(SI), Y0, Y0 + VPXOR 416(SI), Y14, Y14 + VPXOR 448(SI), Y12, Y12 + VPXOR 480(SI), Y4, Y4 + VMOVDQU Y0, 384(DI) + VMOVDQU Y14, 416(DI) + VMOVDQU Y12, 448(DI) + VMOVDQU Y4, 480(DI) + LEAQ 512(SI), SI + LEAQ 512(DI), DI + SUBQ $0x00000200, BX JMP openAVX2MainLoop openAVX2MainLoopDone: // Handle the various tail sizes efficiently - TESTQ inl, inl + TESTQ BX, BX JE openSSEFinalize - CMPQ inl, $128 + CMPQ BX, $0x80 JBE openAVX2Tail128 - CMPQ inl, $256 + CMPQ BX, $0x00000100 JBE openAVX2Tail256 - CMPQ inl, $384 + CMPQ BX, $0x00000180 JBE openAVX2Tail384 JMP openAVX2Tail512 -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 193 bytes openAVX2192: - // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks - VMOVDQA AA0, AA1 - VMOVDQA BB0, BB1 - VMOVDQA CC0, CC1 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2 - VMOVDQA BB0, BB2 - VMOVDQA CC0, CC2 - VMOVDQA DD0, DD2 - VMOVDQA DD1, TT3 - MOVQ $10, itr2 + VMOVDQA Y0, Y5 + VMOVDQA Y14, Y9 + VMOVDQA Y12, Y13 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y0, Y6 + VMOVDQA Y14, Y10 + VMOVDQA Y12, Y8 + VMOVDQA Y4, Y2 + VMOVDQA Y1, Y15 + MOVQ $0x0000000a, R9 openAVX2192InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + DECQ R9 JNE openAVX2192InnerCipherLoop - VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 - VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 - VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 - VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 + VPADDD Y6, Y0, Y0 + VPADDD Y6, Y5, Y5 + VPADDD Y10, Y14, Y14 + VPADDD Y10, Y9, Y9 + VPADDD Y8, Y12, Y12 + VPADDD Y8, Y13, Y13 + VPADDD Y2, Y4, Y4 + VPADDD Y15, Y1, Y1 + VPERM2I128 $0x02, Y0, Y14, Y3 // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 + VPAND ·polyClampMask<>+0(SB), Y3, Y3 + VMOVDQA Y3, (BP) // Stream for up to 192 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x13, Y0, Y14, Y0 + VPERM2I128 $0x13, Y12, Y4, Y14 + VPERM2I128 $0x02, Y5, Y9, Y12 + VPERM2I128 $0x02, Y13, Y1, Y4 + VPERM2I128 $0x13, Y5, Y9, Y5 + VPERM2I128 $0x13, Y13, Y1, Y9 openAVX2ShortOpen: // Hash - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) openAVX2ShortOpenLoop: - CMPQ inl, $32 + CMPQ BX, $0x20 JB openAVX2ShortTail32 - SUBQ $32, inl + SUBQ $0x20, BX // Load for hashing - polyAdd(0*8(inp)) - polyMulAVX2 - polyAdd(2*8(inp)) - polyMulAVX2 + ADDQ (SI), R10 + ADCQ 8(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ 16(SI), R10 + ADCQ 24(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Load for decryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp - LEAQ (1*32)(oup), oup + VPXOR (SI), Y0, Y0 + VMOVDQU Y0, (DI) + LEAQ 32(SI), SI + LEAQ 32(DI), DI // Shift stream left - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 - VMOVDQA AA1, DD0 - VMOVDQA BB1, AA1 - VMOVDQA CC1, BB1 - VMOVDQA DD1, CC1 - VMOVDQA AA2, DD1 - VMOVDQA BB2, AA2 + VMOVDQA Y14, Y0 + VMOVDQA Y12, Y14 + VMOVDQA Y4, Y12 + VMOVDQA Y5, Y4 + VMOVDQA Y9, Y5 + VMOVDQA Y13, Y9 + VMOVDQA Y1, Y13 + VMOVDQA Y6, Y1 + VMOVDQA Y10, Y6 JMP openAVX2ShortOpenLoop openAVX2ShortTail32: - CMPQ inl, $16 - VMOVDQA A0, A1 + CMPQ BX, $0x10 + VMOVDQA X0, X1 JB openAVX2ShortDone - - SUBQ $16, inl + SUBQ $0x10, BX // Load for hashing - polyAdd(0*8(inp)) - polyMulAVX2 + ADDQ (SI), R10 + ADCQ 8(SI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Load for decryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 + VPXOR (SI), X0, X12 + VMOVDQU X12, (DI) + LEAQ 16(SI), SI + LEAQ 16(DI), DI + VPERM2I128 $0x11, Y0, Y0, Y0 + VMOVDQA X0, X1 openAVX2ShortDone: VZEROUPPER JMP openSSETail16 -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 321 bytes openAVX2320: - // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks - VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 - MOVQ $10, itr2 + VMOVDQA Y0, Y5 + VMOVDQA Y14, Y9 + VMOVDQA Y12, Y13 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y0, Y6 + VMOVDQA Y14, Y10 + VMOVDQA Y12, Y8 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VMOVDQA Y14, Y7 + VMOVDQA Y12, Y11 + VMOVDQA Y4, Y15 + MOVQ $0x0000000a, R9 openAVX2320InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + DECQ R9 JNE openAVX2320InnerCipherLoop - - VMOVDQA ·chacha20Constants<>(SB), TT0 - VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 - VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 - VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 - VMOVDQA ·avx2IncMask<>(SB), TT0 - VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD2, DD2 + VMOVDQA ·chacha20Constants<>+0(SB), Y3 + VPADDD Y3, Y0, Y0 + VPADDD Y3, Y5, Y5 + VPADDD Y3, Y6, Y6 + VPADDD Y7, Y14, Y14 + VPADDD Y7, Y9, Y9 + VPADDD Y7, Y10, Y10 + VPADDD Y11, Y12, Y12 + VPADDD Y11, Y13, Y13 + VPADDD Y11, Y8, Y8 + VMOVDQA ·avx2IncMask<>+0(SB), Y3 + VPADDD Y15, Y4, Y4 + VPADDD Y3, Y15, Y15 + VPADDD Y15, Y1, Y1 + VPADDD Y3, Y15, Y15 + VPADDD Y15, Y2, Y2 // Clamp and store poly key - VPERM2I128 $0x02, AA0, BB0, TT0 - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 + VPERM2I128 $0x02, Y0, Y14, Y3 + VPAND ·polyClampMask<>+0(SB), Y3, Y3 + VMOVDQA Y3, (BP) // Stream for up to 320 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - VPERM2I128 $0x02, AA2, BB2, CC1 - VPERM2I128 $0x02, CC2, DD2, DD1 - VPERM2I128 $0x13, AA2, BB2, AA2 - VPERM2I128 $0x13, CC2, DD2, BB2 + VPERM2I128 $0x13, Y0, Y14, Y0 + VPERM2I128 $0x13, Y12, Y4, Y14 + VPERM2I128 $0x02, Y5, Y9, Y12 + VPERM2I128 $0x02, Y13, Y1, Y4 + VPERM2I128 $0x13, Y5, Y9, Y5 + VPERM2I128 $0x13, Y13, Y1, Y9 + VPERM2I128 $0x02, Y6, Y10, Y13 + VPERM2I128 $0x02, Y8, Y2, Y1 + VPERM2I128 $0x13, Y6, Y10, Y6 + VPERM2I128 $0x13, Y8, Y2, Y10 JMP openAVX2ShortOpen -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext openAVX2Tail128: // Need to decrypt up to 128 bytes - prepare two blocks - VMOVDQA ·chacha20Constants<>(SB), AA1 - VMOVDQA state1StoreAVX2, BB1 - VMOVDQA state2StoreAVX2, CC1 - VMOVDQA ctr3StoreAVX2, DD1 - VPADDD ·avx2IncMask<>(SB), DD1, DD1 - VMOVDQA DD1, DD0 - - XORQ itr2, itr2 - MOVQ inl, itr1 - ANDQ $-16, itr1 - TESTQ itr1, itr1 - JE openAVX2Tail128LoopB + VMOVDQA ·chacha20Constants<>+0(SB), Y5 + VMOVDQA 32(BP), Y9 + VMOVDQA 64(BP), Y13 + VMOVDQA 192(BP), Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y1 + VMOVDQA Y1, Y4 + XORQ R9, R9 + MOVQ BX, CX + ANDQ $-16, CX + TESTQ CX, CX + JE openAVX2Tail128LoopB openAVX2Tail128LoopA: - // Perform ChaCha rounds, while hashing the remaining input - polyAdd(0(inp)(itr2*1)) - polyMulAVX2 + ADDQ (SI)(R9*1), R10 + ADCQ 8(SI)(R9*1), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 openAVX2Tail128LoopB: - ADDQ $16, itr2 - chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD1, DD1, DD1 - CMPQ itr2, itr1 - JB openAVX2Tail128LoopA - CMPQ itr2, $160 - JNE openAVX2Tail128LoopB - - VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC1, CC1 - VPADDD DD0, DD1, DD1 - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 + ADDQ $0x10, R9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y1, Y1, Y1 + CMPQ R9, CX + JB openAVX2Tail128LoopA + CMPQ R9, $0xa0 + JNE openAVX2Tail128LoopB + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD 32(BP), Y9, Y9 + VPADDD 64(BP), Y13, Y13 + VPADDD Y4, Y1, Y1 + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 openAVX2TailLoop: - CMPQ inl, $32 + CMPQ BX, $0x20 JB openAVX2Tail - SUBQ $32, inl + SUBQ $0x20, BX // Load for decryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp - LEAQ (1*32)(oup), oup - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 + VPXOR (SI), Y0, Y0 + VMOVDQU Y0, (DI) + LEAQ 32(SI), SI + LEAQ 32(DI), DI + VMOVDQA Y14, Y0 + VMOVDQA Y12, Y14 + VMOVDQA Y4, Y12 JMP openAVX2TailLoop openAVX2Tail: - CMPQ inl, $16 - VMOVDQA A0, A1 + CMPQ BX, $0x10 + VMOVDQA X0, X1 JB openAVX2TailDone - SUBQ $16, inl + SUBQ $0x10, BX // Load for decryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 + VPXOR (SI), X0, X12 + VMOVDQU X12, (DI) + LEAQ 16(SI), SI + LEAQ 16(DI), DI + VPERM2I128 $0x11, Y0, Y0, Y0 + VMOVDQA X0, X1 openAVX2TailDone: VZEROUPPER JMP openSSETail16 -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext openAVX2Tail256: - // Need to decrypt up to 256 bytes - prepare four blocks - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA DD0, TT1 - VMOVDQA DD1, TT2 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y4, Y7 + VMOVDQA Y1, Y11 // Compute the number of iterations that will hash data - MOVQ inl, tmpStoreAVX2 - MOVQ inl, itr1 - SUBQ $128, itr1 - SHRQ $4, itr1 - MOVQ $10, itr2 - CMPQ itr1, $10 - CMOVQGT itr2, itr1 - MOVQ inp, inl - XORQ itr2, itr2 + MOVQ BX, 224(BP) + MOVQ BX, CX + SUBQ $0x80, CX + SHRQ $0x04, CX + MOVQ $0x0000000a, R9 + CMPQ CX, $0x0a + CMOVQGT R9, CX + MOVQ SI, BX + XORQ R9, R9 openAVX2Tail256LoopA: - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl + ADDQ (BX), R10 + ADCQ 8(BX), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(BX), BX - // Perform ChaCha rounds, while hashing the remaining input openAVX2Tail256LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - INCQ itr2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - CMPQ itr2, itr1 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + INCQ R9 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + CMPQ R9, CX JB openAVX2Tail256LoopA + CMPQ R9, $0x0a + JNE openAVX2Tail256LoopB + MOVQ BX, R9 + SUBQ SI, BX + MOVQ BX, CX + MOVQ 224(BP), BX - CMPQ itr2, $10 - JNE openAVX2Tail256LoopB - - MOVQ inl, itr2 - SUBQ inp, inl - MOVQ inl, itr1 - MOVQ tmpStoreAVX2, inl - - // Hash the remainder of data (if any) openAVX2Tail256Hash: - ADDQ $16, itr1 - CMPQ itr1, inl - JGT openAVX2Tail256HashEnd - polyAdd (0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - JMP openAVX2Tail256Hash - -// Store 128 bytes safely, then go to store loop + ADDQ $0x10, CX + CMPQ CX, BX + JGT openAVX2Tail256HashEnd + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(R9), R9 + JMP openAVX2Tail256Hash + openAVX2Tail256HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, AA2; VPERM2I128 $0x02, CC0, DD0, BB2; VPERM2I128 $0x13, AA0, BB0, CC2; VPERM2I128 $0x13, CC0, DD0, DD2 - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - - VPXOR (0*32)(inp), AA2, AA2; VPXOR (1*32)(inp), BB2, BB2; VPXOR (2*32)(inp), CC2, CC2; VPXOR (3*32)(inp), DD2, DD2 - VMOVDQU AA2, (0*32)(oup); VMOVDQU BB2, (1*32)(oup); VMOVDQU CC2, (2*32)(oup); VMOVDQU DD2, (3*32)(oup) - LEAQ (4*32)(inp), inp - LEAQ (4*32)(oup), oup - SUBQ $4*32, inl - - JMP openAVX2TailLoop - -// ---------------------------------------------------------------------------- -// Special optimization for the last 384 bytes of ciphertext + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD Y7, Y4, Y4 + VPADDD Y11, Y1, Y1 + VPERM2I128 $0x02, Y0, Y14, Y6 + VPERM2I128 $0x02, Y12, Y4, Y10 + VPERM2I128 $0x13, Y0, Y14, Y8 + VPERM2I128 $0x13, Y12, Y4, Y2 + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR (SI), Y6, Y6 + VPXOR 32(SI), Y10, Y10 + VPXOR 64(SI), Y8, Y8 + VPXOR 96(SI), Y2, Y2 + VMOVDQU Y6, (DI) + VMOVDQU Y10, 32(DI) + VMOVDQU Y8, 64(DI) + VMOVDQU Y2, 96(DI) + LEAQ 128(SI), SI + LEAQ 128(DI), DI + SUBQ $0x80, BX + JMP openAVX2TailLoop + openAVX2Tail384: // Need to decrypt up to 384 bytes - prepare six blocks - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA DD0, ctr0StoreAVX2 - VMOVDQA DD1, ctr1StoreAVX2 - VMOVDQA DD2, ctr2StoreAVX2 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) // Compute the number of iterations that will hash two blocks of data - MOVQ inl, tmpStoreAVX2 - MOVQ inl, itr1 - SUBQ $256, itr1 - SHRQ $4, itr1 - ADDQ $6, itr1 - MOVQ $10, itr2 - CMPQ itr1, $10 - CMOVQGT itr2, itr1 - MOVQ inp, inl - XORQ itr2, itr2 - - // Perform ChaCha rounds, while hashing the remaining input + MOVQ BX, 224(BP) + MOVQ BX, CX + SUBQ $0x00000100, CX + SHRQ $0x04, CX + ADDQ $0x06, CX + MOVQ $0x0000000a, R9 + CMPQ CX, $0x0a + CMOVQGT R9, CX + MOVQ SI, BX + XORQ R9, R9 + openAVX2Tail384LoopB: - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl + ADDQ (BX), R10 + ADCQ 8(BX), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(BX), BX openAVX2Tail384LoopA: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - polyAdd(0(inl)) - polyMulAVX2 - LEAQ 16(inl), inl - INCQ itr2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - - CMPQ itr2, itr1 - JB openAVX2Tail384LoopB - - CMPQ itr2, $10 - JNE openAVX2Tail384LoopA - - MOVQ inl, itr2 - SUBQ inp, inl - MOVQ inl, itr1 - MOVQ tmpStoreAVX2, inl + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + ADDQ (BX), R10 + ADCQ 8(BX), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(BX), BX + INCQ R9 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + CMPQ R9, CX + JB openAVX2Tail384LoopB + CMPQ R9, $0x0a + JNE openAVX2Tail384LoopA + MOVQ BX, R9 + SUBQ SI, BX + MOVQ BX, CX + MOVQ 224(BP), BX openAVX2Tail384Hash: - ADDQ $16, itr1 - CMPQ itr1, inl - JGT openAVX2Tail384HashEnd - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - JMP openAVX2Tail384Hash - -// Store 256 bytes safely, then go to store loop + ADDQ $0x10, CX + CMPQ CX, BX + JGT openAVX2Tail384HashEnd + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(R9), R9 + JMP openAVX2Tail384Hash + openAVX2Tail384HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2 - VPERM2I128 $0x02, AA0, BB0, TT0; VPERM2I128 $0x02, CC0, DD0, TT1; VPERM2I128 $0x13, AA0, BB0, TT2; VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, TT0; VPERM2I128 $0x02, CC1, DD1, TT1; VPERM2I128 $0x13, AA1, BB1, TT2; VPERM2I128 $0x13, CC1, DD1, TT3 - VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 - VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - LEAQ (8*32)(inp), inp - LEAQ (8*32)(oup), oup - SUBQ $8*32, inl + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPERM2I128 $0x02, Y0, Y14, Y3 + VPERM2I128 $0x02, Y12, Y4, Y7 + VPERM2I128 $0x13, Y0, Y14, Y11 + VPERM2I128 $0x13, Y12, Y4, Y15 + VPXOR (SI), Y3, Y3 + VPXOR 32(SI), Y7, Y7 + VPXOR 64(SI), Y11, Y11 + VPXOR 96(SI), Y15, Y15 + VMOVDQU Y3, (DI) + VMOVDQU Y7, 32(DI) + VMOVDQU Y11, 64(DI) + VMOVDQU Y15, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y3 + VPERM2I128 $0x02, Y13, Y1, Y7 + VPERM2I128 $0x13, Y5, Y9, Y11 + VPERM2I128 $0x13, Y13, Y1, Y15 + VPXOR 128(SI), Y3, Y3 + VPXOR 160(SI), Y7, Y7 + VPXOR 192(SI), Y11, Y11 + VPXOR 224(SI), Y15, Y15 + VMOVDQU Y3, 128(DI) + VMOVDQU Y7, 160(DI) + VMOVDQU Y11, 192(DI) + VMOVDQU Y15, 224(DI) + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + LEAQ 256(SI), SI + LEAQ 256(DI), DI + SUBQ $0x00000100, BX JMP openAVX2TailLoop -// ---------------------------------------------------------------------------- -// Special optimization for the last 512 bytes of ciphertext openAVX2Tail512: - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - XORQ itr1, itr1 - MOVQ inp, itr2 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) + XORQ CX, CX + MOVQ SI, R9 openAVX2Tail512LoopB: - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ (2*8)(itr2), itr2 + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(R9), R9 openAVX2Tail512LoopA: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyAdd(0*8(itr2)) - polyMulAVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(2*8(itr2)) - polyMulAVX2 - LEAQ (4*8)(itr2), itr2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - INCQ itr1 - CMPQ itr1, $4 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x0c, Y3, Y3, Y3 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + ADDQ 16(R9), R10 + ADCQ 24(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(R9), R9 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x04, Y3, Y3, Y3 + INCQ CX + CMPQ CX, $0x04 JLT openAVX2Tail512LoopB - - CMPQ itr1, $10 - JNE openAVX2Tail512LoopA - - MOVQ inl, itr1 - SUBQ $384, itr1 - ANDQ $-16, itr1 + CMPQ CX, $0x0a + JNE openAVX2Tail512LoopA + MOVQ BX, CX + SUBQ $0x00000180, CX + ANDQ $-16, CX openAVX2Tail512HashLoop: - TESTQ itr1, itr1 + TESTQ CX, CX JE openAVX2Tail512HashEnd - polyAdd(0(itr2)) - polyMulAVX2 - LEAQ 16(itr2), itr2 - SUBQ $16, itr1 + ADDQ (R9), R10 + ADCQ 8(R9), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(R9), R9 + SUBQ $0x10, CX JMP openAVX2Tail512HashLoop openAVX2Tail512HashEnd: - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - - LEAQ (12*32)(inp), inp - LEAQ (12*32)(oup), oup - SUBQ $12*32, inl - - JMP openAVX2TailLoop - -// ---------------------------------------------------------------------------- -// ---------------------------------------------------------------------------- -// func chacha20Poly1305Seal(dst, key, src, ad []byte) -TEXT ·chacha20Poly1305Seal(SB), 0, $288-96 - // For aligned stack access + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD ·chacha20Constants<>+0(SB), Y7, Y7 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 32(BP), Y11, Y11 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 64(BP), Y15, Y15 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPADDD 192(BP), Y3, Y3 + VMOVDQA Y15, 224(BP) + VPERM2I128 $0x02, Y0, Y14, Y15 + VPERM2I128 $0x13, Y0, Y14, Y14 + VPERM2I128 $0x02, Y12, Y4, Y0 + VPERM2I128 $0x13, Y12, Y4, Y12 + VPXOR (SI), Y15, Y15 + VPXOR 32(SI), Y0, Y0 + VPXOR 64(SI), Y14, Y14 + VPXOR 96(SI), Y12, Y12 + VMOVDQU Y15, (DI) + VMOVDQU Y0, 32(DI) + VMOVDQU Y14, 64(DI) + VMOVDQU Y12, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR 128(SI), Y0, Y0 + VPXOR 160(SI), Y14, Y14 + VPXOR 192(SI), Y12, Y12 + VPXOR 224(SI), Y4, Y4 + VMOVDQU Y0, 128(DI) + VMOVDQU Y14, 160(DI) + VMOVDQU Y12, 192(DI) + VMOVDQU Y4, 224(DI) + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + VPXOR 256(SI), Y0, Y0 + VPXOR 288(SI), Y14, Y14 + VPXOR 320(SI), Y12, Y12 + VPXOR 352(SI), Y4, Y4 + VMOVDQU Y0, 256(DI) + VMOVDQU Y14, 288(DI) + VMOVDQU Y12, 320(DI) + VMOVDQU Y4, 352(DI) + VPERM2I128 $0x02, Y7, Y11, Y0 + VPERM2I128 $0x02, 224(BP), Y3, Y14 + VPERM2I128 $0x13, Y7, Y11, Y12 + VPERM2I128 $0x13, 224(BP), Y3, Y4 + LEAQ 384(SI), SI + LEAQ 384(DI), DI + SUBQ $0x00000180, BX + JMP openAVX2TailLoop + +DATA ·chacha20Constants<>+0(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+4(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+8(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+12(SB)/4, $0x6b206574 +DATA ·chacha20Constants<>+16(SB)/4, $0x61707865 +DATA ·chacha20Constants<>+20(SB)/4, $0x3320646e +DATA ·chacha20Constants<>+24(SB)/4, $0x79622d32 +DATA ·chacha20Constants<>+28(SB)/4, $0x6b206574 +GLOBL ·chacha20Constants<>(SB), RODATA|NOPTR, $32 + +DATA ·polyClampMask<>+0(SB)/8, $0x0ffffffc0fffffff +DATA ·polyClampMask<>+8(SB)/8, $0x0ffffffc0ffffffc +DATA ·polyClampMask<>+16(SB)/8, $0xffffffffffffffff +DATA ·polyClampMask<>+24(SB)/8, $0xffffffffffffffff +GLOBL ·polyClampMask<>(SB), RODATA|NOPTR, $32 + +DATA ·sseIncMask<>+0(SB)/8, $0x0000000000000001 +DATA ·sseIncMask<>+8(SB)/8, $0x0000000000000000 +GLOBL ·sseIncMask<>(SB), RODATA|NOPTR, $16 + +DATA ·andMask<>+0(SB)/8, $0x00000000000000ff +DATA ·andMask<>+8(SB)/8, $0x0000000000000000 +DATA ·andMask<>+16(SB)/8, $0x000000000000ffff +DATA ·andMask<>+24(SB)/8, $0x0000000000000000 +DATA ·andMask<>+32(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+40(SB)/8, $0x0000000000000000 +DATA ·andMask<>+48(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+56(SB)/8, $0x0000000000000000 +DATA ·andMask<>+64(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+72(SB)/8, $0x0000000000000000 +DATA ·andMask<>+80(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+88(SB)/8, $0x0000000000000000 +DATA ·andMask<>+96(SB)/8, $0x00ffffffffffffff +DATA ·andMask<>+104(SB)/8, $0x0000000000000000 +DATA ·andMask<>+112(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+120(SB)/8, $0x0000000000000000 +DATA ·andMask<>+128(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+136(SB)/8, $0x00000000000000ff +DATA ·andMask<>+144(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+152(SB)/8, $0x000000000000ffff +DATA ·andMask<>+160(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+168(SB)/8, $0x0000000000ffffff +DATA ·andMask<>+176(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+184(SB)/8, $0x00000000ffffffff +DATA ·andMask<>+192(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+200(SB)/8, $0x000000ffffffffff +DATA ·andMask<>+208(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+216(SB)/8, $0x0000ffffffffffff +DATA ·andMask<>+224(SB)/8, $0xffffffffffffffff +DATA ·andMask<>+232(SB)/8, $0x00ffffffffffffff +GLOBL ·andMask<>(SB), RODATA|NOPTR, $240 + +DATA ·avx2InitMask<>+0(SB)/8, $0x0000000000000000 +DATA ·avx2InitMask<>+8(SB)/8, $0x0000000000000000 +DATA ·avx2InitMask<>+16(SB)/8, $0x0000000000000001 +DATA ·avx2InitMask<>+24(SB)/8, $0x0000000000000000 +GLOBL ·avx2InitMask<>(SB), RODATA|NOPTR, $32 + +DATA ·rol16<>+0(SB)/8, $0x0504070601000302 +DATA ·rol16<>+8(SB)/8, $0x0d0c0f0e09080b0a +DATA ·rol16<>+16(SB)/8, $0x0504070601000302 +DATA ·rol16<>+24(SB)/8, $0x0d0c0f0e09080b0a +GLOBL ·rol16<>(SB), RODATA|NOPTR, $32 + +DATA ·rol8<>+0(SB)/8, $0x0605040702010003 +DATA ·rol8<>+8(SB)/8, $0x0e0d0c0f0a09080b +DATA ·rol8<>+16(SB)/8, $0x0605040702010003 +DATA ·rol8<>+24(SB)/8, $0x0e0d0c0f0a09080b +GLOBL ·rol8<>(SB), RODATA|NOPTR, $32 + +DATA ·avx2IncMask<>+0(SB)/8, $0x0000000000000002 +DATA ·avx2IncMask<>+8(SB)/8, $0x0000000000000000 +DATA ·avx2IncMask<>+16(SB)/8, $0x0000000000000002 +DATA ·avx2IncMask<>+24(SB)/8, $0x0000000000000000 +GLOBL ·avx2IncMask<>(SB), RODATA|NOPTR, $32 + +// func chacha20Poly1305Seal(dst []byte, key []uint32, src []byte, ad []byte) +// Requires: AVX, AVX2, BMI2, CMOV, SSE2 +TEXT ·chacha20Poly1305Seal(SB), $288-96 MOVQ SP, BP - ADDQ $32, BP + ADDQ $0x20, BP ANDQ $-32, BP - MOVQ dst+0(FP), oup - MOVQ key+24(FP), keyp - MOVQ src+48(FP), inp - MOVQ src_len+56(FP), inl - MOVQ ad+72(FP), adp - - CMPB ·useAVX2(SB), $1 + MOVQ dst_base+0(FP), DI + MOVQ key_base+24(FP), R8 + MOVQ src_base+48(FP), SI + MOVQ src_len+56(FP), BX + MOVQ ad_base+72(FP), CX + CMPB ·useAVX2+0(SB), $0x01 JE chacha20Poly1305Seal_AVX2 // Special optimization, for very short buffers - CMPQ inl, $128 - JBE sealSSE128 // About 15% faster + CMPQ BX, $0x80 + JBE sealSSE128 // In the seal case - prepare the poly key + 3 blocks of stream in the first iteration - MOVOU ·chacha20Constants<>(SB), A0 - MOVOU (1*16)(keyp), B0 - MOVOU (2*16)(keyp), C0 - MOVOU (3*16)(keyp), D0 + MOVOU ·chacha20Constants<>+0(SB), X0 + MOVOU 16(R8), X3 + MOVOU 32(R8), X6 + MOVOU 48(R8), X9 // Store state on stack for future use - MOVO B0, state1Store - MOVO C0, state2Store + MOVO X3, 32(BP) + MOVO X6, 48(BP) // Load state, increment counter blocks - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X2, X12 + MOVO X5, X13 + MOVO X8, X14 + MOVO X11, X15 + PADDL ·sseIncMask<>+0(SB), X15 // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store - MOVQ $10, itr2 + MOVO X9, 80(BP) + MOVO X10, 96(BP) + MOVO X11, 112(BP) + MOVO X15, 128(BP) + MOVQ $0x0000000a, R9 sealSSEIntroLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr2 - JNE sealSSEIntroLoop + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x0c + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x04 + DECQ R9 + JNE sealSSEIntroLoop // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 + PADDD ·chacha20Constants<>+0(SB), X0 + PADDD ·chacha20Constants<>+0(SB), X1 + PADDD ·chacha20Constants<>+0(SB), X2 + PADDD ·chacha20Constants<>+0(SB), X12 + PADDD 32(BP), X3 + PADDD 32(BP), X4 + PADDD 32(BP), X5 + PADDD 32(BP), X13 + PADDD 48(BP), X7 + PADDD 48(BP), X8 + PADDD 48(BP), X14 + PADDD 96(BP), X10 + PADDD 112(BP), X11 + PADDD 128(BP), X15 // Clamp and store the key - PAND ·polyClampMask<>(SB), A0 - MOVO A0, rStore - MOVO B0, sStore + PAND ·polyClampMask<>+0(SB), X0 + MOVO X0, (BP) + MOVO X3, 16(BP) // Hash AAD - MOVQ ad_len+80(FP), itr2 - CALL polyHashADInternal<>(SB) - - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (0*16)(oup); MOVOU B1, (1*16)(oup); MOVOU C1, (2*16)(oup); MOVOU D1, (3*16)(oup) - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (4*16)(oup); MOVOU B2, (5*16)(oup); MOVOU C2, (6*16)(oup); MOVOU D2, (7*16)(oup) - - MOVQ $128, itr1 - SUBQ $128, inl - LEAQ 128(inp), inp - - MOVO A3, A1; MOVO B3, B1; MOVO C3, C1; MOVO D3, D1 - - CMPQ inl, $64 - JBE sealSSE128SealHash - - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 - MOVOU A3, (8*16)(oup); MOVOU B3, (9*16)(oup); MOVOU C3, (10*16)(oup); MOVOU D3, (11*16)(oup) - - ADDQ $64, itr1 - SUBQ $64, inl - LEAQ 64(inp), inp - - MOVQ $2, itr1 - MOVQ $8, itr2 - - CMPQ inl, $64 - JBE sealSSETail64 - CMPQ inl, $128 - JBE sealSSETail128 - CMPQ inl, $192 - JBE sealSSETail192 + MOVQ ad_len+80(FP), R9 + CALL polyHashADInternal<>(SB) + MOVOU (SI), X0 + MOVOU 16(SI), X3 + MOVOU 32(SI), X6 + MOVOU 48(SI), X9 + PXOR X0, X1 + PXOR X3, X4 + PXOR X6, X7 + PXOR X9, X10 + MOVOU X1, (DI) + MOVOU X4, 16(DI) + MOVOU X7, 32(DI) + MOVOU X10, 48(DI) + MOVOU 64(SI), X0 + MOVOU 80(SI), X3 + MOVOU 96(SI), X6 + MOVOU 112(SI), X9 + PXOR X0, X2 + PXOR X3, X5 + PXOR X6, X8 + PXOR X9, X11 + MOVOU X2, 64(DI) + MOVOU X5, 80(DI) + MOVOU X8, 96(DI) + MOVOU X11, 112(DI) + MOVQ $0x00000080, CX + SUBQ $0x80, BX + LEAQ 128(SI), SI + MOVO X12, X1 + MOVO X13, X4 + MOVO X14, X7 + MOVO X15, X10 + CMPQ BX, $0x40 + JBE sealSSE128SealHash + MOVOU (SI), X0 + MOVOU 16(SI), X3 + MOVOU 32(SI), X6 + MOVOU 48(SI), X9 + PXOR X0, X12 + PXOR X3, X13 + PXOR X6, X14 + PXOR X9, X15 + MOVOU X12, 128(DI) + MOVOU X13, 144(DI) + MOVOU X14, 160(DI) + MOVOU X15, 176(DI) + ADDQ $0x40, CX + SUBQ $0x40, BX + LEAQ 64(SI), SI + MOVQ $0x00000002, CX + MOVQ $0x00000008, R9 + CMPQ BX, $0x40 + JBE sealSSETail64 + CMPQ BX, $0x80 + JBE sealSSETail128 + CMPQ BX, $0xc0 + JBE sealSSETail192 sealSSEMainLoop: // Load state, increment counter blocks - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO A2, A3; MOVO B2, B3; MOVO C2, C3; MOVO D2, D3; PADDL ·sseIncMask<>(SB), D3 + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X2, X12 + MOVO X5, X13 + MOVO X8, X14 + MOVO X11, X15 + PADDL ·sseIncMask<>+0(SB), X15 // Store counters - MOVO D0, ctr0Store; MOVO D1, ctr1Store; MOVO D2, ctr2Store; MOVO D3, ctr3Store + MOVO X9, 80(BP) + MOVO X10, 96(BP) + MOVO X11, 112(BP) + MOVO X15, 128(BP) sealSSEInnerLoop: - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyAdd(0(oup)) - shiftB0Left; shiftB1Left; shiftB2Left; shiftB3Left - shiftC0Left; shiftC1Left; shiftC2Left; shiftC3Left - shiftD0Left; shiftD1Left; shiftD2Left; shiftD3Left - polyMulStage1 - polyMulStage2 - LEAQ (2*8)(oup), oup - MOVO C3, tmpStore - chachaQR(A0, B0, C0, D0, C3); chachaQR(A1, B1, C1, D1, C3); chachaQR(A2, B2, C2, D2, C3) - MOVO tmpStore, C3 - MOVO C1, tmpStore - polyMulStage3 - chachaQR(A3, B3, C3, D3, C1) - MOVO tmpStore, C1 - polyMulReduceStage - shiftB0Right; shiftB1Right; shiftB2Right; shiftB3Right - shiftC0Right; shiftC1Right; shiftC2Right; shiftC3Right - shiftD0Right; shiftD1Right; shiftD2Right; shiftD3Right - DECQ itr2 - JGE sealSSEInnerLoop - polyAdd(0(oup)) - polyMul - LEAQ (2*8)(oup), oup - DECQ itr1 - JG sealSSEInnerLoop + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x0c + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + LEAQ 16(DI), DI + MOVO X14, 64(BP) + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X3 + PXOR X14, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X14) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X3 + PXOR X14, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X4 + PXOR X14, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X14) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X4 + PXOR X14, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x0c, X14 + PSRLL $0x14, X5 + PXOR X14, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X14) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X14 + PSLLL $0x07, X14 + PSRLL $0x19, X5 + PXOR X14, X5 + MOVO 64(BP), X14 + MOVO X7, 64(BP) + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + PADDD X13, X12 + PXOR X12, X15 + ROL16(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x0c, X7 + PSRLL $0x14, X13 + PXOR X7, X13 + PADDD X13, X12 + PXOR X12, X15 + ROL8(X15, X7) + PADDD X15, X14 + PXOR X14, X13 + MOVO X13, X7 + PSLLL $0x07, X7 + PSRLL $0x19, X13 + PXOR X7, X13 + MOVO 64(BP), X7 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x04 + DECQ R9 + JGE sealSSEInnerLoop + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI + DECQ CX + JG sealSSEInnerLoop // Add in the state - PADDD ·chacha20Constants<>(SB), A0; PADDD ·chacha20Constants<>(SB), A1; PADDD ·chacha20Constants<>(SB), A2; PADDD ·chacha20Constants<>(SB), A3 - PADDD state1Store, B0; PADDD state1Store, B1; PADDD state1Store, B2; PADDD state1Store, B3 - PADDD state2Store, C0; PADDD state2Store, C1; PADDD state2Store, C2; PADDD state2Store, C3 - PADDD ctr0Store, D0; PADDD ctr1Store, D1; PADDD ctr2Store, D2; PADDD ctr3Store, D3 - MOVO D3, tmpStore + PADDD ·chacha20Constants<>+0(SB), X0 + PADDD ·chacha20Constants<>+0(SB), X1 + PADDD ·chacha20Constants<>+0(SB), X2 + PADDD ·chacha20Constants<>+0(SB), X12 + PADDD 32(BP), X3 + PADDD 32(BP), X4 + PADDD 32(BP), X5 + PADDD 32(BP), X13 + PADDD 48(BP), X6 + PADDD 48(BP), X7 + PADDD 48(BP), X8 + PADDD 48(BP), X14 + PADDD 80(BP), X9 + PADDD 96(BP), X10 + PADDD 112(BP), X11 + PADDD 128(BP), X15 + MOVO X15, 64(BP) // Load - xor - store - MOVOU (0*16)(inp), D3; PXOR D3, A0 - MOVOU (1*16)(inp), D3; PXOR D3, B0 - MOVOU (2*16)(inp), D3; PXOR D3, C0 - MOVOU (3*16)(inp), D3; PXOR D3, D0 - MOVOU A0, (0*16)(oup) - MOVOU B0, (1*16)(oup) - MOVOU C0, (2*16)(oup) - MOVOU D0, (3*16)(oup) - MOVO tmpStore, D3 - - MOVOU (4*16)(inp), A0; MOVOU (5*16)(inp), B0; MOVOU (6*16)(inp), C0; MOVOU (7*16)(inp), D0 - PXOR A0, A1; PXOR B0, B1; PXOR C0, C1; PXOR D0, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - MOVOU (8*16)(inp), A0; MOVOU (9*16)(inp), B0; MOVOU (10*16)(inp), C0; MOVOU (11*16)(inp), D0 - PXOR A0, A2; PXOR B0, B2; PXOR C0, C2; PXOR D0, D2 - MOVOU A2, (8*16)(oup); MOVOU B2, (9*16)(oup); MOVOU C2, (10*16)(oup); MOVOU D2, (11*16)(oup) - ADDQ $192, inp - MOVQ $192, itr1 - SUBQ $192, inl - MOVO A3, A1 - MOVO B3, B1 - MOVO C3, C1 - MOVO D3, D1 - CMPQ inl, $64 + MOVOU (SI), X15 + PXOR X15, X0 + MOVOU 16(SI), X15 + PXOR X15, X3 + MOVOU 32(SI), X15 + PXOR X15, X6 + MOVOU 48(SI), X15 + PXOR X15, X9 + MOVOU X0, (DI) + MOVOU X3, 16(DI) + MOVOU X6, 32(DI) + MOVOU X9, 48(DI) + MOVO 64(BP), X15 + MOVOU 64(SI), X0 + MOVOU 80(SI), X3 + MOVOU 96(SI), X6 + MOVOU 112(SI), X9 + PXOR X0, X1 + PXOR X3, X4 + PXOR X6, X7 + PXOR X9, X10 + MOVOU X1, 64(DI) + MOVOU X4, 80(DI) + MOVOU X7, 96(DI) + MOVOU X10, 112(DI) + MOVOU 128(SI), X0 + MOVOU 144(SI), X3 + MOVOU 160(SI), X6 + MOVOU 176(SI), X9 + PXOR X0, X2 + PXOR X3, X5 + PXOR X6, X8 + PXOR X9, X11 + MOVOU X2, 128(DI) + MOVOU X5, 144(DI) + MOVOU X8, 160(DI) + MOVOU X11, 176(DI) + ADDQ $0xc0, SI + MOVQ $0x000000c0, CX + SUBQ $0xc0, BX + MOVO X12, X1 + MOVO X13, X4 + MOVO X14, X7 + MOVO X15, X10 + CMPQ BX, $0x40 JBE sealSSE128SealHash - MOVOU (0*16)(inp), A0; MOVOU (1*16)(inp), B0; MOVOU (2*16)(inp), C0; MOVOU (3*16)(inp), D0 - PXOR A0, A3; PXOR B0, B3; PXOR C0, C3; PXOR D0, D3 - MOVOU A3, (12*16)(oup); MOVOU B3, (13*16)(oup); MOVOU C3, (14*16)(oup); MOVOU D3, (15*16)(oup) - LEAQ 64(inp), inp - SUBQ $64, inl - MOVQ $6, itr1 - MOVQ $4, itr2 - CMPQ inl, $192 + MOVOU (SI), X0 + MOVOU 16(SI), X3 + MOVOU 32(SI), X6 + MOVOU 48(SI), X9 + PXOR X0, X12 + PXOR X3, X13 + PXOR X6, X14 + PXOR X9, X15 + MOVOU X12, 192(DI) + MOVOU X13, 208(DI) + MOVOU X14, 224(DI) + MOVOU X15, 240(DI) + LEAQ 64(SI), SI + SUBQ $0x40, BX + MOVQ $0x00000006, CX + MOVQ $0x00000004, R9 + CMPQ BX, $0xc0 JG sealSSEMainLoop - - MOVQ inl, itr1 - TESTQ inl, inl + MOVQ BX, CX + TESTQ BX, BX JE sealSSE128SealHash - MOVQ $6, itr1 - CMPQ inl, $64 + MOVQ $0x00000006, CX + CMPQ BX, $0x40 JBE sealSSETail64 - CMPQ inl, $128 + CMPQ BX, $0x80 JBE sealSSETail128 JMP sealSSETail192 -// ---------------------------------------------------------------------------- -// Special optimization for the last 64 bytes of plaintext sealSSETail64: - // Need to encrypt up to 64 bytes - prepare single block, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A1 - MOVO state1Store, B1 - MOVO state2Store, C1 - MOVO ctr3Store, D1 - PADDL ·sseIncMask<>(SB), D1 - MOVO D1, ctr0Store + MOVO ·chacha20Constants<>+0(SB), X1 + MOVO 32(BP), X4 + MOVO 48(BP), X7 + MOVO 128(BP), X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X10, 80(BP) sealSSETail64LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealSSETail64LoopB: - chachaQR(A1, B1, C1, D1, T1) - shiftB1Left; shiftC1Left; shiftD1Left - chachaQR(A1, B1, C1, D1, T1) - shiftB1Right; shiftC1Right; shiftD1Right - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - - DECQ itr1 - JG sealSSETail64LoopA - - DECQ itr2 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X13) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X13 + PSLLL $0x0c, X13 + PSRLL $0x14, X4 + PXOR X13, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X13) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X13 + PSLLL $0x07, X13 + PSRLL $0x19, X4 + PXOR X13, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X13) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X13 + PSLLL $0x0c, X13 + PSRLL $0x14, X4 + PXOR X13, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X13) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X13 + PSLLL $0x07, X13 + PSRLL $0x19, X4 + PXOR X13, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI + DECQ CX + JG sealSSETail64LoopA + DECQ R9 JGE sealSSETail64LoopB - PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B1 - PADDL state2Store, C1 - PADDL ctr0Store, D1 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL 32(BP), X4 + PADDL 48(BP), X7 + PADDL 80(BP), X10 + JMP sealSSE128Seal - JMP sealSSE128Seal - -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of plaintext sealSSETail128: - // Need to encrypt up to 128 bytes - prepare two blocks, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X9, 80(BP) + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X10, 96(BP) sealSSETail128LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealSSETail128LoopB: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - - DECQ itr1 - JG sealSSETail128LoopA - - DECQ itr2 - JGE sealSSETail128LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1 - PADDL state1Store, B0; PADDL state1Store, B1 - PADDL state2Store, C0; PADDL state2Store, C1 - PADDL ctr0Store, D0; PADDL ctr1Store, D1 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 - MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) - - MOVQ $64, itr1 - LEAQ 64(inp), inp - SUBQ $64, inl - - JMP sealSSE128SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 192 bytes of plaintext + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + DECQ CX + JG sealSSETail128LoopA + DECQ R9 + JGE sealSSETail128LoopB + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL 32(BP), X3 + PADDL 32(BP), X4 + PADDL 48(BP), X6 + PADDL 48(BP), X7 + PADDL 80(BP), X9 + PADDL 96(BP), X10 + MOVOU (SI), X12 + MOVOU 16(SI), X13 + MOVOU 32(SI), X14 + MOVOU 48(SI), X15 + PXOR X12, X0 + PXOR X13, X3 + PXOR X14, X6 + PXOR X15, X9 + MOVOU X0, (DI) + MOVOU X3, 16(DI) + MOVOU X6, 32(DI) + MOVOU X9, 48(DI) + MOVQ $0x00000040, CX + LEAQ 64(SI), SI + SUBQ $0x40, BX + JMP sealSSE128SealHash + sealSSETail192: - // Need to encrypt up to 192 bytes - prepare three blocks, hash 192 or 256 bytes - MOVO ·chacha20Constants<>(SB), A0; MOVO state1Store, B0; MOVO state2Store, C0; MOVO ctr3Store, D0; PADDL ·sseIncMask<>(SB), D0; MOVO D0, ctr0Store - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1; MOVO D1, ctr1Store - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2; MOVO D2, ctr2Store + MOVO ·chacha20Constants<>+0(SB), X0 + MOVO 32(BP), X3 + MOVO 48(BP), X6 + MOVO 128(BP), X9 + PADDL ·sseIncMask<>+0(SB), X9 + MOVO X9, 80(BP) + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X10, 96(BP) + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X11, 112(BP) sealSSETail192LoopA: - // Perform ChaCha rounds, while hashing the previously encrypted ciphertext - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealSSETail192LoopB: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftC0Left; shiftD0Left - shiftB1Left; shiftC1Left; shiftD1Left - shiftB2Left; shiftC2Left; shiftD2Left - - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup - - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftC0Right; shiftD0Right - shiftB1Right; shiftC1Right; shiftD1Right - shiftB2Right; shiftC2Right; shiftD2Right - - DECQ itr1 - JG sealSSETail192LoopA - - DECQ itr2 - JGE sealSSETail192LoopB - - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL state1Store, B0; PADDL state1Store, B1; PADDL state1Store, B2 - PADDL state2Store, C0; PADDL state2Store, C1; PADDL state2Store, C2 - PADDL ctr0Store, D0; PADDL ctr1Store, D1; PADDL ctr2Store, D2 - - MOVOU (0*16)(inp), T0; MOVOU (1*16)(inp), T1; MOVOU (2*16)(inp), T2; MOVOU (3*16)(inp), T3 - PXOR T0, A0; PXOR T1, B0; PXOR T2, C0; PXOR T3, D0 - MOVOU A0, (0*16)(oup); MOVOU B0, (1*16)(oup); MOVOU C0, (2*16)(oup); MOVOU D0, (3*16)(oup) - MOVOU (4*16)(inp), T0; MOVOU (5*16)(inp), T1; MOVOU (6*16)(inp), T2; MOVOU (7*16)(inp), T3 - PXOR T0, A1; PXOR T1, B1; PXOR T2, C1; PXOR T3, D1 - MOVOU A1, (4*16)(oup); MOVOU B1, (5*16)(oup); MOVOU C1, (6*16)(oup); MOVOU D1, (7*16)(oup) - - MOVO A2, A1 - MOVO B2, B1 - MOVO C2, C1 - MOVO D2, D1 - MOVQ $128, itr1 - LEAQ 128(inp), inp - SUBQ $128, inl - - JMP sealSSE128SealHash - -// ---------------------------------------------------------------------------- -// Special seal optimization for buffers smaller than 129 bytes + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + DECQ CX + JG sealSSETail192LoopA + DECQ R9 + JGE sealSSETail192LoopB + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL ·chacha20Constants<>+0(SB), X2 + PADDL 32(BP), X3 + PADDL 32(BP), X4 + PADDL 32(BP), X5 + PADDL 48(BP), X6 + PADDL 48(BP), X7 + PADDL 48(BP), X8 + PADDL 80(BP), X9 + PADDL 96(BP), X10 + PADDL 112(BP), X11 + MOVOU (SI), X12 + MOVOU 16(SI), X13 + MOVOU 32(SI), X14 + MOVOU 48(SI), X15 + PXOR X12, X0 + PXOR X13, X3 + PXOR X14, X6 + PXOR X15, X9 + MOVOU X0, (DI) + MOVOU X3, 16(DI) + MOVOU X6, 32(DI) + MOVOU X9, 48(DI) + MOVOU 64(SI), X12 + MOVOU 80(SI), X13 + MOVOU 96(SI), X14 + MOVOU 112(SI), X15 + PXOR X12, X1 + PXOR X13, X4 + PXOR X14, X7 + PXOR X15, X10 + MOVOU X1, 64(DI) + MOVOU X4, 80(DI) + MOVOU X7, 96(DI) + MOVOU X10, 112(DI) + MOVO X2, X1 + MOVO X5, X4 + MOVO X8, X7 + MOVO X11, X10 + MOVQ $0x00000080, CX + LEAQ 128(SI), SI + SUBQ $0x80, BX + JMP sealSSE128SealHash + sealSSE128: - // For up to 128 bytes of ciphertext and 64 bytes for the poly key, we require to process three blocks - MOVOU ·chacha20Constants<>(SB), A0; MOVOU (1*16)(keyp), B0; MOVOU (2*16)(keyp), C0; MOVOU (3*16)(keyp), D0 - MOVO A0, A1; MOVO B0, B1; MOVO C0, C1; MOVO D0, D1; PADDL ·sseIncMask<>(SB), D1 - MOVO A1, A2; MOVO B1, B2; MOVO C1, C2; MOVO D1, D2; PADDL ·sseIncMask<>(SB), D2 - MOVO B0, T1; MOVO C0, T2; MOVO D1, T3 - MOVQ $10, itr2 + MOVOU ·chacha20Constants<>+0(SB), X0 + MOVOU 16(R8), X3 + MOVOU 32(R8), X6 + MOVOU 48(R8), X9 + MOVO X0, X1 + MOVO X3, X4 + MOVO X6, X7 + MOVO X9, X10 + PADDL ·sseIncMask<>+0(SB), X10 + MOVO X1, X2 + MOVO X4, X5 + MOVO X7, X8 + MOVO X10, X11 + PADDL ·sseIncMask<>+0(SB), X11 + MOVO X3, X13 + MOVO X6, X14 + MOVO X10, X15 + MOVQ $0x0000000a, R9 sealSSE128InnerCipherLoop: - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Left; shiftB1Left; shiftB2Left - shiftC0Left; shiftC1Left; shiftC2Left - shiftD0Left; shiftD1Left; shiftD2Left - chachaQR(A0, B0, C0, D0, T0); chachaQR(A1, B1, C1, D1, T0); chachaQR(A2, B2, C2, D2, T0) - shiftB0Right; shiftB1Right; shiftB2Right - shiftC0Right; shiftC1Right; shiftC2Right - shiftD0Right; shiftD1Right; shiftD2Right - DECQ itr2 - JNE sealSSE128InnerCipherLoop + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x04 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x0c + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + PADDD X3, X0 + PXOR X0, X9 + ROL16(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X3 + PXOR X12, X3 + PADDD X3, X0 + PXOR X0, X9 + ROL8(X9, X12) + PADDD X9, X6 + PXOR X6, X3 + MOVO X3, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X3 + PXOR X12, X3 + PADDD X4, X1 + PXOR X1, X10 + ROL16(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X4 + PXOR X12, X4 + PADDD X4, X1 + PXOR X1, X10 + ROL8(X10, X12) + PADDD X10, X7 + PXOR X7, X4 + MOVO X4, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X4 + PXOR X12, X4 + PADDD X5, X2 + PXOR X2, X11 + ROL16(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x0c, X12 + PSRLL $0x14, X5 + PXOR X12, X5 + PADDD X5, X2 + PXOR X2, X11 + ROL8(X11, X12) + PADDD X11, X8 + PXOR X8, X5 + MOVO X5, X12 + PSLLL $0x07, X12 + PSRLL $0x19, X5 + PXOR X12, X5 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xe4 + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xed + BYTE $0x0c + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xf6 + BYTE $0x08 + BYTE $0x66 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xff + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc0 + BYTE $0x08 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xc9 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xd2 + BYTE $0x04 + BYTE $0x66 + BYTE $0x45 + BYTE $0x0f + BYTE $0x3a + BYTE $0x0f + BYTE $0xdb + BYTE $0x04 + DECQ R9 + JNE sealSSE128InnerCipherLoop // A0|B0 hold the Poly1305 32-byte key, C0,D0 can be discarded - PADDL ·chacha20Constants<>(SB), A0; PADDL ·chacha20Constants<>(SB), A1; PADDL ·chacha20Constants<>(SB), A2 - PADDL T1, B0; PADDL T1, B1; PADDL T1, B2 - PADDL T2, C1; PADDL T2, C2 - PADDL T3, D1; PADDL ·sseIncMask<>(SB), T3; PADDL T3, D2 - PAND ·polyClampMask<>(SB), A0 - MOVOU A0, rStore - MOVOU B0, sStore + PADDL ·chacha20Constants<>+0(SB), X0 + PADDL ·chacha20Constants<>+0(SB), X1 + PADDL ·chacha20Constants<>+0(SB), X2 + PADDL X13, X3 + PADDL X13, X4 + PADDL X13, X5 + PADDL X14, X7 + PADDL X14, X8 + PADDL X15, X10 + PADDL ·sseIncMask<>+0(SB), X15 + PADDL X15, X11 + PAND ·polyClampMask<>+0(SB), X0 + MOVOU X0, (BP) + MOVOU X3, 16(BP) // Hash - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 + XORQ CX, CX sealSSE128SealHash: - // itr1 holds the number of bytes encrypted but not yet hashed - CMPQ itr1, $16 - JB sealSSE128Seal - polyAdd(0(oup)) - polyMul - - SUBQ $16, itr1 - ADDQ $16, oup - - JMP sealSSE128SealHash + CMPQ CX, $0x10 + JB sealSSE128Seal + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + SUBQ $0x10, CX + ADDQ $0x10, DI + JMP sealSSE128SealHash sealSSE128Seal: - CMPQ inl, $16 + CMPQ BX, $0x10 JB sealSSETail - SUBQ $16, inl + SUBQ $0x10, BX // Load for decryption - MOVOU (inp), T0 - PXOR T0, A1 - MOVOU A1, (oup) - LEAQ (1*16)(inp), inp - LEAQ (1*16)(oup), oup + MOVOU (SI), X12 + PXOR X12, X1 + MOVOU X1, (DI) + LEAQ 16(SI), SI + LEAQ 16(DI), DI // Extract for hashing - MOVQ A1, t0 - PSRLDQ $8, A1 - MOVQ A1, t1 - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul + MOVQ X1, R13 + PSRLDQ $0x08, X1 + MOVQ X1, R14 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Shift the stream "left" - MOVO B1, A1 - MOVO C1, B1 - MOVO D1, C1 - MOVO A2, D1 - MOVO B2, A2 - MOVO C2, B2 - MOVO D2, C2 + MOVO X4, X1 + MOVO X7, X4 + MOVO X10, X7 + MOVO X2, X10 + MOVO X5, X2 + MOVO X8, X5 + MOVO X11, X8 JMP sealSSE128Seal sealSSETail: - TESTQ inl, inl + TESTQ BX, BX JE sealSSEFinalize // We can only load the PT one byte at a time to avoid read after end of buffer - MOVQ inl, itr2 - SHLQ $4, itr2 - LEAQ ·andMask<>(SB), t0 - MOVQ inl, itr1 - LEAQ -1(inp)(inl*1), inp - XORQ t2, t2 - XORQ t3, t3 + MOVQ BX, R9 + SHLQ $0x04, R9 + LEAQ ·andMask<>+0(SB), R13 + MOVQ BX, CX + LEAQ -1(SI)(BX*1), SI + XORQ R15, R15 + XORQ R8, R8 XORQ AX, AX sealSSETailLoadLoop: - SHLQ $8, t2, t3 - SHLQ $8, t2 - MOVB (inp), AX - XORQ AX, t2 - LEAQ -1(inp), inp - DECQ itr1 + SHLQ $0x08, R15, R8 + SHLQ $0x08, R15 + MOVB (SI), AX + XORQ AX, R15 + LEAQ -1(SI), SI + DECQ CX JNE sealSSETailLoadLoop - MOVQ t2, 0+tmpStore - MOVQ t3, 8+tmpStore - PXOR 0+tmpStore, A1 - MOVOU A1, (oup) - MOVOU -16(t0)(itr2*1), T0 - PAND T0, A1 - MOVQ A1, t0 - PSRLDQ $8, A1 - MOVQ A1, t1 - ADDQ t0, acc0; ADCQ t1, acc1; ADCQ $1, acc2 - polyMul - - ADDQ inl, oup + MOVQ R15, 64(BP) + MOVQ R8, 72(BP) + PXOR 64(BP), X1 + MOVOU X1, (DI) + MOVOU -16(R13)(R9*1), X12 + PAND X12, X1 + MOVQ X1, R13 + PSRLDQ $0x08, X1 + MOVQ X1, R14 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ BX, DI sealSSEFinalize: // Hash in the buffer lengths - ADDQ ad_len+80(FP), acc0 - ADCQ src_len+56(FP), acc1 - ADCQ $1, acc2 - polyMul + ADDQ ad_len+80(FP), R10 + ADCQ src_len+56(FP), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 // Final reduce - MOVQ acc0, t0 - MOVQ acc1, t1 - MOVQ acc2, t2 - SUBQ $-5, acc0 - SBBQ $-1, acc1 - SBBQ $3, acc2 - CMOVQCS t0, acc0 - CMOVQCS t1, acc1 - CMOVQCS t2, acc2 + MOVQ R10, R13 + MOVQ R11, R14 + MOVQ R12, R15 + SUBQ $-5, R10 + SBBQ $-1, R11 + SBBQ $0x03, R12 + CMOVQCS R13, R10 + CMOVQCS R14, R11 + CMOVQCS R15, R12 // Add in the "s" part of the key - ADDQ 0+sStore, acc0 - ADCQ 8+sStore, acc1 + ADDQ 16(BP), R10 + ADCQ 24(BP), R11 // Finally store the tag at the end of the message - MOVQ acc0, (0*8)(oup) - MOVQ acc1, (1*8)(oup) + MOVQ R10, (DI) + MOVQ R11, 8(DI) RET -// ---------------------------------------------------------------------------- -// ------------------------- AVX2 Code ---------------------------------------- chacha20Poly1305Seal_AVX2: VZEROUPPER - VMOVDQU ·chacha20Constants<>(SB), AA0 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x70; BYTE $0x10 // broadcasti128 16(r8), ymm14 - BYTE $0xc4; BYTE $0x42; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x20 // broadcasti128 32(r8), ymm12 - BYTE $0xc4; BYTE $0xc2; BYTE $0x7d; BYTE $0x5a; BYTE $0x60; BYTE $0x30 // broadcasti128 48(r8), ymm4 - VPADDD ·avx2InitMask<>(SB), DD0, DD0 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + BYTE $0xc4 + BYTE $0x42 + BYTE $0x7d + BYTE $0x5a + BYTE $0x70 + BYTE $0x10 + BYTE $0xc4 + BYTE $0x42 + BYTE $0x7d + BYTE $0x5a + BYTE $0x60 + BYTE $0x20 + BYTE $0xc4 + BYTE $0xc2 + BYTE $0x7d + BYTE $0x5a + BYTE $0x60 + BYTE $0x30 + VPADDD ·avx2InitMask<>+0(SB), Y4, Y4 // Special optimizations, for very short buffers - CMPQ inl, $192 - JBE seal192AVX2 // 33% faster - CMPQ inl, $320 - JBE seal320AVX2 // 17% faster + CMPQ BX, $0x000000c0 + JBE seal192AVX2 + CMPQ BX, $0x00000140 + JBE seal320AVX2 // For the general key prepare the key first - as a byproduct we have 64 bytes of cipher stream - VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3; VMOVDQA BB0, state1StoreAVX2 - VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3; VMOVDQA CC0, state2StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD0, DD1; VMOVDQA DD0, ctr0StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD1, DD2; VMOVDQA DD1, ctr1StoreAVX2 - VPADDD ·avx2IncMask<>(SB), DD2, DD3; VMOVDQA DD2, ctr2StoreAVX2 - VMOVDQA DD3, ctr3StoreAVX2 - MOVQ $10, itr2 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA Y14, 32(BP) + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA Y12, 64(BP) + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y4, 96(BP) + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VMOVDQA Y1, 128(BP) + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) + MOVQ $0x0000000a, R9 sealAVX2IntroLoop: - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 - VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 - VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 - VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 - VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 - DECQ itr2 - JNE sealAVX2IntroLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - - VPERM2I128 $0x13, CC0, DD0, CC0 // Stream bytes 96 - 127 - VPERM2I128 $0x02, AA0, BB0, DD0 // The Poly1305 key - VPERM2I128 $0x13, AA0, BB0, AA0 // Stream bytes 64 - 95 + VMOVDQA Y15, 224(BP) + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VMOVDQA 224(BP), Y15 + VMOVDQA Y13, 224(BP) + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x0c, Y11, Y13 + VPSRLD $0x14, Y11, Y11 + VPXOR Y13, Y11, Y11 + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x07, Y11, Y13 + VPSRLD $0x19, Y11, Y11 + VPXOR Y13, Y11, Y11 + VMOVDQA 224(BP), Y13 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y3, Y3, Y3 + VMOVDQA Y15, 224(BP) + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VMOVDQA 224(BP), Y15 + VMOVDQA Y13, 224(BP) + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x0c, Y11, Y13 + VPSRLD $0x14, Y11, Y11 + VPXOR Y13, Y11, Y11 + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x07, Y11, Y13 + VPSRLD $0x19, Y11, Y11 + VPXOR Y13, Y11, Y11 + VMOVDQA 224(BP), Y13 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y3, Y3, Y3 + DECQ R9 + JNE sealAVX2IntroLoop + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD ·chacha20Constants<>+0(SB), Y7, Y7 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 32(BP), Y11, Y11 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 64(BP), Y15, Y15 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPADDD 192(BP), Y3, Y3 + VPERM2I128 $0x13, Y12, Y4, Y12 + VPERM2I128 $0x02, Y0, Y14, Y4 + VPERM2I128 $0x13, Y0, Y14, Y0 // Clamp and store poly key - VPAND ·polyClampMask<>(SB), DD0, DD0 - VMOVDQA DD0, rsStoreAVX2 + VPAND ·polyClampMask<>+0(SB), Y4, Y4 + VMOVDQA Y4, (BP) // Hash AD - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) // Can store at least 320 bytes - VPXOR (0*32)(inp), AA0, AA0 - VPXOR (1*32)(inp), CC0, CC0 - VMOVDQU AA0, (0*32)(oup) - VMOVDQU CC0, (1*32)(oup) - - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (2*32)(inp), AA0, AA0; VPXOR (3*32)(inp), BB0, BB0; VPXOR (4*32)(inp), CC0, CC0; VPXOR (5*32)(inp), DD0, DD0 - VMOVDQU AA0, (2*32)(oup); VMOVDQU BB0, (3*32)(oup); VMOVDQU CC0, (4*32)(oup); VMOVDQU DD0, (5*32)(oup) - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (6*32)(inp), AA0, AA0; VPXOR (7*32)(inp), BB0, BB0; VPXOR (8*32)(inp), CC0, CC0; VPXOR (9*32)(inp), DD0, DD0 - VMOVDQU AA0, (6*32)(oup); VMOVDQU BB0, (7*32)(oup); VMOVDQU CC0, (8*32)(oup); VMOVDQU DD0, (9*32)(oup) - - MOVQ $320, itr1 - SUBQ $320, inl - LEAQ 320(inp), inp - - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, CC3, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, CC3, DD3, DD0 - CMPQ inl, $128 + VPXOR (SI), Y0, Y0 + VPXOR 32(SI), Y12, Y12 + VMOVDQU Y0, (DI) + VMOVDQU Y12, 32(DI) + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR 64(SI), Y0, Y0 + VPXOR 96(SI), Y14, Y14 + VPXOR 128(SI), Y12, Y12 + VPXOR 160(SI), Y4, Y4 + VMOVDQU Y0, 64(DI) + VMOVDQU Y14, 96(DI) + VMOVDQU Y12, 128(DI) + VMOVDQU Y4, 160(DI) + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + VPXOR 192(SI), Y0, Y0 + VPXOR 224(SI), Y14, Y14 + VPXOR 256(SI), Y12, Y12 + VPXOR 288(SI), Y4, Y4 + VMOVDQU Y0, 192(DI) + VMOVDQU Y14, 224(DI) + VMOVDQU Y12, 256(DI) + VMOVDQU Y4, 288(DI) + MOVQ $0x00000140, CX + SUBQ $0x00000140, BX + LEAQ 320(SI), SI + VPERM2I128 $0x02, Y7, Y11, Y0 + VPERM2I128 $0x02, Y15, Y3, Y14 + VPERM2I128 $0x13, Y7, Y11, Y12 + VPERM2I128 $0x13, Y15, Y3, Y4 + CMPQ BX, $0x80 JBE sealAVX2SealHash - - VPXOR (0*32)(inp), AA0, AA0; VPXOR (1*32)(inp), BB0, BB0; VPXOR (2*32)(inp), CC0, CC0; VPXOR (3*32)(inp), DD0, DD0 - VMOVDQU AA0, (10*32)(oup); VMOVDQU BB0, (11*32)(oup); VMOVDQU CC0, (12*32)(oup); VMOVDQU DD0, (13*32)(oup) - SUBQ $128, inl - LEAQ 128(inp), inp - - MOVQ $8, itr1 - MOVQ $2, itr2 - - CMPQ inl, $128 - JBE sealAVX2Tail128 - CMPQ inl, $256 - JBE sealAVX2Tail256 - CMPQ inl, $384 - JBE sealAVX2Tail384 - CMPQ inl, $512 - JBE sealAVX2Tail512 + VPXOR (SI), Y0, Y0 + VPXOR 32(SI), Y14, Y14 + VPXOR 64(SI), Y12, Y12 + VPXOR 96(SI), Y4, Y4 + VMOVDQU Y0, 320(DI) + VMOVDQU Y14, 352(DI) + VMOVDQU Y12, 384(DI) + VMOVDQU Y4, 416(DI) + SUBQ $0x80, BX + LEAQ 128(SI), SI + MOVQ $0x00000008, CX + MOVQ $0x00000002, R9 + CMPQ BX, $0x80 + JBE sealAVX2Tail128 + CMPQ BX, $0x00000100 + JBE sealAVX2Tail256 + CMPQ BX, $0x00000180 + JBE sealAVX2Tail384 + CMPQ BX, $0x00000200 + JBE sealAVX2Tail512 // We have 448 bytes to hash, but main loop hashes 512 bytes at a time - perform some rounds, before the main loop - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $12, DD0, DD0, DD0 - VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $12, DD1, DD1, DD1 - VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $12, DD2, DD2, DD2 - VPALIGNR $4, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $12, DD3, DD3, DD3 - - VMOVDQA CC3, tmpStoreAVX2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, CC3); chachaQR_AVX2(AA1, BB1, CC1, DD1, CC3); chachaQR_AVX2(AA2, BB2, CC2, DD2, CC3) - VMOVDQA tmpStoreAVX2, CC3 - VMOVDQA CC1, tmpStoreAVX2 - chachaQR_AVX2(AA3, BB3, CC3, DD3, CC1) - VMOVDQA tmpStoreAVX2, CC1 - - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $4, DD0, DD0, DD0 - VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $4, DD1, DD1, DD1 - VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $4, DD2, DD2, DD2 - VPALIGNR $12, BB3, BB3, BB3; VPALIGNR $8, CC3, CC3, CC3; VPALIGNR $4, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - - SUBQ $16, oup // Adjust the pointer - MOVQ $9, itr1 - JMP sealAVX2InternalLoopStart + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) + VMOVDQA Y15, 224(BP) + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VMOVDQA 224(BP), Y15 + VMOVDQA Y13, 224(BP) + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x0c, Y11, Y13 + VPSRLD $0x14, Y11, Y11 + VPXOR Y13, Y11, Y11 + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x07, Y11, Y13 + VPSRLD $0x19, Y11, Y11 + VPXOR Y13, Y11, Y11 + VMOVDQA 224(BP), Y13 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y3, Y3, Y3 + VMOVDQA Y15, 224(BP) + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VMOVDQA 224(BP), Y15 + VMOVDQA Y13, 224(BP) + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x0c, Y11, Y13 + VPSRLD $0x14, Y11, Y11 + VPXOR Y13, Y11, Y11 + VPADDD Y11, Y7, Y7 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y3, Y15, Y15 + VPXOR Y15, Y11, Y11 + VPSLLD $0x07, Y11, Y13 + VPSRLD $0x19, Y11, Y11 + VPXOR Y13, Y11, Y11 + VMOVDQA 224(BP), Y13 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y3, Y3, Y3 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + SUBQ $0x10, DI + MOVQ $0x00000009, CX + JMP sealAVX2InternalLoopStart sealAVX2MainLoop: - // Load state, increment counter blocks, store the incremented counters - VMOVDQU ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 - MOVQ $10, itr1 + VMOVDQU ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) + MOVQ $0x0000000a, CX sealAVX2InternalLoop: - polyAdd(0*8(oup)) - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage1_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulStage2_AVX2 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyMulStage3_AVX2 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 sealAVX2InternalLoopStart: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - polyAdd(2*8(oup)) - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage1_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage2_AVX2 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - polyMulStage3_AVX2 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - polyMulReduceStage - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(4*8(oup)) - LEAQ (6*8)(oup), oup - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulStage1_AVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - polyMulStage2_AVX2 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - polyMulStage3_AVX2 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyMulReduceStage - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - DECQ itr1 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x0c, Y3, Y3, Y3 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + ADDQ 32(DI), R10 + ADCQ 40(DI), R11 + ADCQ $0x01, R12 + LEAQ 48(DI), DI + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x04, Y3, Y3, Y3 + DECQ CX JNE sealAVX2InternalLoop - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD ·chacha20Constants<>+0(SB), Y7, Y7 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 32(BP), Y11, Y11 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 64(BP), Y15, Y15 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPADDD 192(BP), Y3, Y3 + VMOVDQA Y15, 224(BP) // We only hashed 480 of the 512 bytes available - hash the remaining 32 here - polyAdd(0*8(oup)) - polyMulAVX2 - LEAQ (4*8)(oup), oup - VPERM2I128 $0x02, AA0, BB0, CC3; VPERM2I128 $0x13, AA0, BB0, BB0; VPERM2I128 $0x02, CC0, DD0, AA0; VPERM2I128 $0x13, CC0, DD0, CC0 - VPXOR (0*32)(inp), CC3, CC3; VPXOR (1*32)(inp), AA0, AA0; VPXOR (2*32)(inp), BB0, BB0; VPXOR (3*32)(inp), CC0, CC0 - VMOVDQU CC3, (0*32)(oup); VMOVDQU AA0, (1*32)(oup); VMOVDQU BB0, (2*32)(oup); VMOVDQU CC0, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, AA0; VPERM2I128 $0x02, CC1, DD1, BB0; VPERM2I128 $0x13, AA1, BB1, CC0; VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + VPERM2I128 $0x02, Y0, Y14, Y15 + VPERM2I128 $0x13, Y0, Y14, Y14 + VPERM2I128 $0x02, Y12, Y4, Y0 + VPERM2I128 $0x13, Y12, Y4, Y12 + VPXOR (SI), Y15, Y15 + VPXOR 32(SI), Y0, Y0 + VPXOR 64(SI), Y14, Y14 + VPXOR 96(SI), Y12, Y12 + VMOVDQU Y15, (DI) + VMOVDQU Y0, 32(DI) + VMOVDQU Y14, 64(DI) + VMOVDQU Y12, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR 128(SI), Y0, Y0 + VPXOR 160(SI), Y14, Y14 + VPXOR 192(SI), Y12, Y12 + VPXOR 224(SI), Y4, Y4 + VMOVDQU Y0, 128(DI) + VMOVDQU Y14, 160(DI) + VMOVDQU Y12, 192(DI) + VMOVDQU Y4, 224(DI) // and here - polyAdd(-2*8(oup)) - polyMulAVX2 - VPERM2I128 $0x02, AA2, BB2, AA0; VPERM2I128 $0x02, CC2, DD2, BB0; VPERM2I128 $0x13, AA2, BB2, CC0; VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - VPERM2I128 $0x02, AA3, BB3, AA0; VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0; VPERM2I128 $0x13, AA3, BB3, CC0; VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - VPXOR (12*32)(inp), AA0, AA0; VPXOR (13*32)(inp), BB0, BB0; VPXOR (14*32)(inp), CC0, CC0; VPXOR (15*32)(inp), DD0, DD0 - VMOVDQU AA0, (12*32)(oup); VMOVDQU BB0, (13*32)(oup); VMOVDQU CC0, (14*32)(oup); VMOVDQU DD0, (15*32)(oup) - LEAQ (32*16)(inp), inp - SUBQ $(32*16), inl - CMPQ inl, $512 + ADDQ -16(DI), R10 + ADCQ -8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + VPXOR 256(SI), Y0, Y0 + VPXOR 288(SI), Y14, Y14 + VPXOR 320(SI), Y12, Y12 + VPXOR 352(SI), Y4, Y4 + VMOVDQU Y0, 256(DI) + VMOVDQU Y14, 288(DI) + VMOVDQU Y12, 320(DI) + VMOVDQU Y4, 352(DI) + VPERM2I128 $0x02, Y7, Y11, Y0 + VPERM2I128 $0x02, 224(BP), Y3, Y14 + VPERM2I128 $0x13, Y7, Y11, Y12 + VPERM2I128 $0x13, 224(BP), Y3, Y4 + VPXOR 384(SI), Y0, Y0 + VPXOR 416(SI), Y14, Y14 + VPXOR 448(SI), Y12, Y12 + VPXOR 480(SI), Y4, Y4 + VMOVDQU Y0, 384(DI) + VMOVDQU Y14, 416(DI) + VMOVDQU Y12, 448(DI) + VMOVDQU Y4, 480(DI) + LEAQ 512(SI), SI + SUBQ $0x00000200, BX + CMPQ BX, $0x00000200 JG sealAVX2MainLoop // Tail can only hash 480 bytes - polyAdd(0*8(oup)) - polyMulAVX2 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ 32(oup), oup - - MOVQ $10, itr1 - MOVQ $0, itr2 - CMPQ inl, $128 - JBE sealAVX2Tail128 - CMPQ inl, $256 - JBE sealAVX2Tail256 - CMPQ inl, $384 - JBE sealAVX2Tail384 - JMP sealAVX2Tail512 - -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 193 bytes + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + MOVQ $0x0000000a, CX + MOVQ $0x00000000, R9 + CMPQ BX, $0x80 + JBE sealAVX2Tail128 + CMPQ BX, $0x00000100 + JBE sealAVX2Tail256 + CMPQ BX, $0x00000180 + JBE sealAVX2Tail384 + JMP sealAVX2Tail512 + seal192AVX2: - // For up to 192 bytes of ciphertext and 64 bytes for the poly key, we process four blocks - VMOVDQA AA0, AA1 - VMOVDQA BB0, BB1 - VMOVDQA CC0, CC1 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2 - VMOVDQA BB0, BB2 - VMOVDQA CC0, CC2 - VMOVDQA DD0, DD2 - VMOVDQA DD1, TT3 - MOVQ $10, itr2 + VMOVDQA Y0, Y5 + VMOVDQA Y14, Y9 + VMOVDQA Y12, Y13 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y0, Y6 + VMOVDQA Y14, Y10 + VMOVDQA Y12, Y8 + VMOVDQA Y4, Y2 + VMOVDQA Y1, Y15 + MOVQ $0x0000000a, R9 sealAVX2192InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + DECQ R9 JNE sealAVX2192InnerCipherLoop - VPADDD AA2, AA0, AA0; VPADDD AA2, AA1, AA1 - VPADDD BB2, BB0, BB0; VPADDD BB2, BB1, BB1 - VPADDD CC2, CC0, CC0; VPADDD CC2, CC1, CC1 - VPADDD DD2, DD0, DD0; VPADDD TT3, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 + VPADDD Y6, Y0, Y0 + VPADDD Y6, Y5, Y5 + VPADDD Y10, Y14, Y14 + VPADDD Y10, Y9, Y9 + VPADDD Y8, Y12, Y12 + VPADDD Y8, Y13, Y13 + VPADDD Y2, Y4, Y4 + VPADDD Y15, Y1, Y1 + VPERM2I128 $0x02, Y0, Y14, Y3 // Clamp and store poly key - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 + VPAND ·polyClampMask<>+0(SB), Y3, Y3 + VMOVDQA Y3, (BP) // Stream for up to 192 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 + VPERM2I128 $0x13, Y0, Y14, Y0 + VPERM2I128 $0x13, Y12, Y4, Y14 + VPERM2I128 $0x02, Y5, Y9, Y12 + VPERM2I128 $0x02, Y13, Y1, Y4 + VPERM2I128 $0x13, Y5, Y9, Y5 + VPERM2I128 $0x13, Y13, Y1, Y9 sealAVX2ShortSeal: // Hash aad - MOVQ ad_len+80(FP), itr2 + MOVQ ad_len+80(FP), R9 CALL polyHashADInternal<>(SB) - XORQ itr1, itr1 + XORQ CX, CX sealAVX2SealHash: // itr1 holds the number of bytes encrypted but not yet hashed - CMPQ itr1, $16 - JB sealAVX2ShortSealLoop - polyAdd(0(oup)) - polyMul - SUBQ $16, itr1 - ADDQ $16, oup - JMP sealAVX2SealHash + CMPQ CX, $0x10 + JB sealAVX2ShortSealLoop + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + SUBQ $0x10, CX + ADDQ $0x10, DI + JMP sealAVX2SealHash sealAVX2ShortSealLoop: - CMPQ inl, $32 + CMPQ BX, $0x20 JB sealAVX2ShortTail32 - SUBQ $32, inl + SUBQ $0x20, BX // Load for encryption - VPXOR (inp), AA0, AA0 - VMOVDQU AA0, (oup) - LEAQ (1*32)(inp), inp + VPXOR (SI), Y0, Y0 + VMOVDQU Y0, (DI) + LEAQ 32(SI), SI // Now can hash - polyAdd(0*8(oup)) - polyMulAVX2 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ (1*32)(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI // Shift stream left - VMOVDQA BB0, AA0 - VMOVDQA CC0, BB0 - VMOVDQA DD0, CC0 - VMOVDQA AA1, DD0 - VMOVDQA BB1, AA1 - VMOVDQA CC1, BB1 - VMOVDQA DD1, CC1 - VMOVDQA AA2, DD1 - VMOVDQA BB2, AA2 + VMOVDQA Y14, Y0 + VMOVDQA Y12, Y14 + VMOVDQA Y4, Y12 + VMOVDQA Y5, Y4 + VMOVDQA Y9, Y5 + VMOVDQA Y13, Y9 + VMOVDQA Y1, Y13 + VMOVDQA Y6, Y1 + VMOVDQA Y10, Y6 JMP sealAVX2ShortSealLoop sealAVX2ShortTail32: - CMPQ inl, $16 - VMOVDQA A0, A1 + CMPQ BX, $0x10 + VMOVDQA X0, X1 JB sealAVX2ShortDone - - SUBQ $16, inl + SUBQ $0x10, BX // Load for encryption - VPXOR (inp), A0, T0 - VMOVDQU T0, (oup) - LEAQ (1*16)(inp), inp + VPXOR (SI), X0, X12 + VMOVDQU X12, (DI) + LEAQ 16(SI), SI // Hash - polyAdd(0*8(oup)) - polyMulAVX2 - LEAQ (1*16)(oup), oup - VPERM2I128 $0x11, AA0, AA0, AA0 - VMOVDQA A0, A1 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI + VPERM2I128 $0x11, Y0, Y0, Y0 + VMOVDQA X0, X1 sealAVX2ShortDone: VZEROUPPER JMP sealSSETail -// ---------------------------------------------------------------------------- -// Special optimization for buffers smaller than 321 bytes seal320AVX2: - // For up to 320 bytes of ciphertext and 64 bytes for the poly key, we process six blocks - VMOVDQA AA0, AA1; VMOVDQA BB0, BB1; VMOVDQA CC0, CC1; VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA AA0, AA2; VMOVDQA BB0, BB2; VMOVDQA CC0, CC2; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA BB0, TT1; VMOVDQA CC0, TT2; VMOVDQA DD0, TT3 - MOVQ $10, itr2 + VMOVDQA Y0, Y5 + VMOVDQA Y14, Y9 + VMOVDQA Y12, Y13 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y0, Y6 + VMOVDQA Y14, Y10 + VMOVDQA Y12, Y8 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VMOVDQA Y14, Y7 + VMOVDQA Y12, Y11 + VMOVDQA Y4, Y15 + MOVQ $0x0000000a, R9 sealAVX2320InnerCipherLoop: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + DECQ R9 JNE sealAVX2320InnerCipherLoop - - VMOVDQA ·chacha20Constants<>(SB), TT0 - VPADDD TT0, AA0, AA0; VPADDD TT0, AA1, AA1; VPADDD TT0, AA2, AA2 - VPADDD TT1, BB0, BB0; VPADDD TT1, BB1, BB1; VPADDD TT1, BB2, BB2 - VPADDD TT2, CC0, CC0; VPADDD TT2, CC1, CC1; VPADDD TT2, CC2, CC2 - VMOVDQA ·avx2IncMask<>(SB), TT0 - VPADDD TT3, DD0, DD0; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD1, DD1; VPADDD TT0, TT3, TT3 - VPADDD TT3, DD2, DD2 + VMOVDQA ·chacha20Constants<>+0(SB), Y3 + VPADDD Y3, Y0, Y0 + VPADDD Y3, Y5, Y5 + VPADDD Y3, Y6, Y6 + VPADDD Y7, Y14, Y14 + VPADDD Y7, Y9, Y9 + VPADDD Y7, Y10, Y10 + VPADDD Y11, Y12, Y12 + VPADDD Y11, Y13, Y13 + VPADDD Y11, Y8, Y8 + VMOVDQA ·avx2IncMask<>+0(SB), Y3 + VPADDD Y15, Y4, Y4 + VPADDD Y3, Y15, Y15 + VPADDD Y15, Y1, Y1 + VPADDD Y3, Y15, Y15 + VPADDD Y15, Y2, Y2 // Clamp and store poly key - VPERM2I128 $0x02, AA0, BB0, TT0 - VPAND ·polyClampMask<>(SB), TT0, TT0 - VMOVDQA TT0, rsStoreAVX2 + VPERM2I128 $0x02, Y0, Y14, Y3 + VPAND ·polyClampMask<>+0(SB), Y3, Y3 + VMOVDQA Y3, (BP) // Stream for up to 320 bytes - VPERM2I128 $0x13, AA0, BB0, AA0 - VPERM2I128 $0x13, CC0, DD0, BB0 - VPERM2I128 $0x02, AA1, BB1, CC0 - VPERM2I128 $0x02, CC1, DD1, DD0 - VPERM2I128 $0x13, AA1, BB1, AA1 - VPERM2I128 $0x13, CC1, DD1, BB1 - VPERM2I128 $0x02, AA2, BB2, CC1 - VPERM2I128 $0x02, CC2, DD2, DD1 - VPERM2I128 $0x13, AA2, BB2, AA2 - VPERM2I128 $0x13, CC2, DD2, BB2 + VPERM2I128 $0x13, Y0, Y14, Y0 + VPERM2I128 $0x13, Y12, Y4, Y14 + VPERM2I128 $0x02, Y5, Y9, Y12 + VPERM2I128 $0x02, Y13, Y1, Y4 + VPERM2I128 $0x13, Y5, Y9, Y5 + VPERM2I128 $0x13, Y13, Y1, Y9 + VPERM2I128 $0x02, Y6, Y10, Y13 + VPERM2I128 $0x02, Y8, Y2, Y1 + VPERM2I128 $0x13, Y6, Y10, Y6 + VPERM2I128 $0x13, Y8, Y2, Y10 JMP sealAVX2ShortSeal -// ---------------------------------------------------------------------------- -// Special optimization for the last 128 bytes of ciphertext sealAVX2Tail128: - // Need to decrypt up to 128 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0 - VMOVDQA state1StoreAVX2, BB0 - VMOVDQA state2StoreAVX2, CC0 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VMOVDQA DD0, DD1 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA 32(BP), Y14 + VMOVDQA 64(BP), Y12 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VMOVDQA Y4, Y1 sealAVX2Tail128LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealAVX2Tail128LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0 - VPALIGNR $8, CC0, CC0, CC0 - VPALIGNR $12, DD0, DD0, DD0 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0 - VPALIGNR $8, CC0, CC0, CC0 - VPALIGNR $4, DD0, DD0, DD0 - DECQ itr1 - JG sealAVX2Tail128LoopA - DECQ itr2 - JGE sealAVX2Tail128LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA1 - VPADDD state1StoreAVX2, BB0, BB1 - VPADDD state2StoreAVX2, CC0, CC1 - VPADDD DD1, DD0, DD1 - - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x04, Y4, Y4, Y4 + DECQ CX + JG sealAVX2Tail128LoopA + DECQ R9 + JGE sealAVX2Tail128LoopB + VPADDD ·chacha20Constants<>+0(SB), Y0, Y5 + VPADDD 32(BP), Y14, Y9 + VPADDD 64(BP), Y12, Y13 + VPADDD Y1, Y4, Y1 + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 JMP sealAVX2ShortSealLoop -// ---------------------------------------------------------------------------- -// Special optimization for the last 256 bytes of ciphertext sealAVX2Tail256: - // Need to decrypt up to 256 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA ·chacha20Constants<>(SB), AA1 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA state1StoreAVX2, BB1 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA state2StoreAVX2, CC1 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD1 - VMOVDQA DD0, TT1 - VMOVDQA DD1, TT2 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA ·chacha20Constants<>+0(SB), Y5 + VMOVDQA 32(BP), Y14 + VMOVDQA 32(BP), Y9 + VMOVDQA 64(BP), Y12 + VMOVDQA 64(BP), Y13 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VMOVDQA Y4, Y7 + VMOVDQA Y1, Y11 sealAVX2Tail256LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealAVX2Tail256LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1 - DECQ itr1 - JG sealAVX2Tail256LoopA - DECQ itr2 - JGE sealAVX2Tail256LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1 - VPERM2I128 $0x02, AA0, BB0, TT0 - VPERM2I128 $0x02, CC0, DD0, TT1 - VPERM2I128 $0x13, AA0, BB0, TT2 - VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - MOVQ $128, itr1 - LEAQ 128(inp), inp - SUBQ $128, inl - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 - - JMP sealAVX2SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 384 bytes of ciphertext + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + DECQ CX + JG sealAVX2Tail256LoopA + DECQ R9 + JGE sealAVX2Tail256LoopB + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD Y7, Y4, Y4 + VPADDD Y11, Y1, Y1 + VPERM2I128 $0x02, Y0, Y14, Y3 + VPERM2I128 $0x02, Y12, Y4, Y7 + VPERM2I128 $0x13, Y0, Y14, Y11 + VPERM2I128 $0x13, Y12, Y4, Y15 + VPXOR (SI), Y3, Y3 + VPXOR 32(SI), Y7, Y7 + VPXOR 64(SI), Y11, Y11 + VPXOR 96(SI), Y15, Y15 + VMOVDQU Y3, (DI) + VMOVDQU Y7, 32(DI) + VMOVDQU Y11, 64(DI) + VMOVDQU Y15, 96(DI) + MOVQ $0x00000080, CX + LEAQ 128(SI), SI + SUBQ $0x80, BX + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + JMP sealAVX2SealHash + sealAVX2Tail384: - // Need to decrypt up to 384 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2 - VMOVDQA DD0, TT1; VMOVDQA DD1, TT2; VMOVDQA DD2, TT3 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VMOVDQA Y4, Y7 + VMOVDQA Y1, Y11 + VMOVDQA Y2, Y15 sealAVX2Tail384LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealAVX2Tail384LoopB: - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - polyAdd(0(oup)) - polyMul - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2 - chachaQR_AVX2(AA0, BB0, CC0, DD0, TT0); chachaQR_AVX2(AA1, BB1, CC1, DD1, TT0); chachaQR_AVX2(AA2, BB2, CC2, DD2, TT0) - polyAdd(16(oup)) - polyMul - LEAQ 32(oup), oup - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2 - DECQ itr1 - JG sealAVX2Tail384LoopA - DECQ itr2 - JGE sealAVX2Tail384LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2 - VPADDD TT1, DD0, DD0; VPADDD TT2, DD1, DD1; VPADDD TT3, DD2, DD2 - VPERM2I128 $0x02, AA0, BB0, TT0 - VPERM2I128 $0x02, CC0, DD0, TT1 - VPERM2I128 $0x13, AA0, BB0, TT2 - VPERM2I128 $0x13, CC0, DD0, TT3 - VPXOR (0*32)(inp), TT0, TT0; VPXOR (1*32)(inp), TT1, TT1; VPXOR (2*32)(inp), TT2, TT2; VPXOR (3*32)(inp), TT3, TT3 - VMOVDQU TT0, (0*32)(oup); VMOVDQU TT1, (1*32)(oup); VMOVDQU TT2, (2*32)(oup); VMOVDQU TT3, (3*32)(oup) - VPERM2I128 $0x02, AA1, BB1, TT0 - VPERM2I128 $0x02, CC1, DD1, TT1 - VPERM2I128 $0x13, AA1, BB1, TT2 - VPERM2I128 $0x13, CC1, DD1, TT3 - VPXOR (4*32)(inp), TT0, TT0; VPXOR (5*32)(inp), TT1, TT1; VPXOR (6*32)(inp), TT2, TT2; VPXOR (7*32)(inp), TT3, TT3 - VMOVDQU TT0, (4*32)(oup); VMOVDQU TT1, (5*32)(oup); VMOVDQU TT2, (6*32)(oup); VMOVDQU TT3, (7*32)(oup) - MOVQ $256, itr1 - LEAQ 256(inp), inp - SUBQ $256, inl - VPERM2I128 $0x02, AA2, BB2, AA0 - VPERM2I128 $0x02, CC2, DD2, BB0 - VPERM2I128 $0x13, AA2, BB2, CC0 - VPERM2I128 $0x13, CC2, DD2, DD0 - - JMP sealAVX2SealHash - -// ---------------------------------------------------------------------------- -// Special optimization for the last 512 bytes of ciphertext + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x0c, Y14, Y3 + VPSRLD $0x14, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y14, Y0, Y0 + VPXOR Y0, Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPADDD Y4, Y12, Y12 + VPXOR Y12, Y14, Y14 + VPSLLD $0x07, Y14, Y3 + VPSRLD $0x19, Y14, Y14 + VPXOR Y3, Y14, Y14 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x0c, Y9, Y3 + VPSRLD $0x14, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y9, Y5, Y5 + VPXOR Y5, Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPADDD Y1, Y13, Y13 + VPXOR Y13, Y9, Y9 + VPSLLD $0x07, Y9, Y3 + VPSRLD $0x19, Y9, Y9 + VPXOR Y3, Y9, Y9 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x0c, Y10, Y3 + VPSRLD $0x14, Y10, Y10 + VPXOR Y3, Y10, Y10 + VPADDD Y10, Y6, Y6 + VPXOR Y6, Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPADDD Y2, Y8, Y8 + VPXOR Y8, Y10, Y10 + VPSLLD $0x07, Y10, Y3 + VPSRLD $0x19, Y10, Y10 + VPXOR Y3, Y10, Y10 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + DECQ CX + JG sealAVX2Tail384LoopA + DECQ R9 + JGE sealAVX2Tail384LoopB + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD Y7, Y4, Y4 + VPADDD Y11, Y1, Y1 + VPADDD Y15, Y2, Y2 + VPERM2I128 $0x02, Y0, Y14, Y3 + VPERM2I128 $0x02, Y12, Y4, Y7 + VPERM2I128 $0x13, Y0, Y14, Y11 + VPERM2I128 $0x13, Y12, Y4, Y15 + VPXOR (SI), Y3, Y3 + VPXOR 32(SI), Y7, Y7 + VPXOR 64(SI), Y11, Y11 + VPXOR 96(SI), Y15, Y15 + VMOVDQU Y3, (DI) + VMOVDQU Y7, 32(DI) + VMOVDQU Y11, 64(DI) + VMOVDQU Y15, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y3 + VPERM2I128 $0x02, Y13, Y1, Y7 + VPERM2I128 $0x13, Y5, Y9, Y11 + VPERM2I128 $0x13, Y13, Y1, Y15 + VPXOR 128(SI), Y3, Y3 + VPXOR 160(SI), Y7, Y7 + VPXOR 192(SI), Y11, Y11 + VPXOR 224(SI), Y15, Y15 + VMOVDQU Y3, 128(DI) + VMOVDQU Y7, 160(DI) + VMOVDQU Y11, 192(DI) + VMOVDQU Y15, 224(DI) + MOVQ $0x00000100, CX + LEAQ 256(SI), SI + SUBQ $0x00000100, BX + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + JMP sealAVX2SealHash + sealAVX2Tail512: - // Need to decrypt up to 512 bytes - prepare two blocks - // If we got here after the main loop - there are 512 encrypted bytes waiting to be hashed - // If we got here before the main loop - there are 448 encrpyred bytes waiting to be hashed - VMOVDQA ·chacha20Constants<>(SB), AA0; VMOVDQA AA0, AA1; VMOVDQA AA0, AA2; VMOVDQA AA0, AA3 - VMOVDQA state1StoreAVX2, BB0; VMOVDQA BB0, BB1; VMOVDQA BB0, BB2; VMOVDQA BB0, BB3 - VMOVDQA state2StoreAVX2, CC0; VMOVDQA CC0, CC1; VMOVDQA CC0, CC2; VMOVDQA CC0, CC3 - VMOVDQA ctr3StoreAVX2, DD0 - VPADDD ·avx2IncMask<>(SB), DD0, DD0; VPADDD ·avx2IncMask<>(SB), DD0, DD1; VPADDD ·avx2IncMask<>(SB), DD1, DD2; VPADDD ·avx2IncMask<>(SB), DD2, DD3 - VMOVDQA DD0, ctr0StoreAVX2; VMOVDQA DD1, ctr1StoreAVX2; VMOVDQA DD2, ctr2StoreAVX2; VMOVDQA DD3, ctr3StoreAVX2 + VMOVDQA ·chacha20Constants<>+0(SB), Y0 + VMOVDQA Y0, Y5 + VMOVDQA Y0, Y6 + VMOVDQA Y0, Y7 + VMOVDQA 32(BP), Y14 + VMOVDQA Y14, Y9 + VMOVDQA Y14, Y10 + VMOVDQA Y14, Y11 + VMOVDQA 64(BP), Y12 + VMOVDQA Y12, Y13 + VMOVDQA Y12, Y8 + VMOVDQA Y12, Y15 + VMOVDQA 192(BP), Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y4 + VPADDD ·avx2IncMask<>+0(SB), Y4, Y1 + VPADDD ·avx2IncMask<>+0(SB), Y1, Y2 + VPADDD ·avx2IncMask<>+0(SB), Y2, Y3 + VMOVDQA Y4, 96(BP) + VMOVDQA Y1, 128(BP) + VMOVDQA Y2, 160(BP) + VMOVDQA Y3, 192(BP) sealAVX2Tail512LoopA: - polyAdd(0(oup)) - polyMul - LEAQ 16(oup), oup + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), AX + MOVQ AX, R15 + MULQ R10 + MOVQ AX, R13 + MOVQ DX, R14 + MOVQ (BP), AX + MULQ R11 + IMULQ R12, R15 + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), AX + MOVQ AX, R8 + MULQ R10 + ADDQ AX, R14 + ADCQ $0x00, DX + MOVQ DX, R10 + MOVQ 8(BP), AX + MULQ R11 + ADDQ AX, R15 + ADCQ $0x00, DX + IMULQ R12, R8 + ADDQ R10, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 16(DI), DI sealAVX2Tail512LoopB: - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - polyAdd(0*8(oup)) - polyMulAVX2 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $4, BB0, BB0, BB0; VPALIGNR $4, BB1, BB1, BB1; VPALIGNR $4, BB2, BB2, BB2; VPALIGNR $4, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $12, DD0, DD0, DD0; VPALIGNR $12, DD1, DD1, DD1; VPALIGNR $12, DD2, DD2, DD2; VPALIGNR $12, DD3, DD3, DD3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol16<>(SB), DD0, DD0; VPSHUFB ·rol16<>(SB), DD1, DD1; VPSHUFB ·rol16<>(SB), DD2, DD2; VPSHUFB ·rol16<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - polyAdd(2*8(oup)) - polyMulAVX2 - LEAQ (4*8)(oup), oup - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $12, BB0, CC3; VPSRLD $20, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $12, BB1, CC3; VPSRLD $20, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $12, BB2, CC3; VPSRLD $20, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $12, BB3, CC3; VPSRLD $20, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPADDD BB0, AA0, AA0; VPADDD BB1, AA1, AA1; VPADDD BB2, AA2, AA2; VPADDD BB3, AA3, AA3 - VPXOR AA0, DD0, DD0; VPXOR AA1, DD1, DD1; VPXOR AA2, DD2, DD2; VPXOR AA3, DD3, DD3 - VPSHUFB ·rol8<>(SB), DD0, DD0; VPSHUFB ·rol8<>(SB), DD1, DD1; VPSHUFB ·rol8<>(SB), DD2, DD2; VPSHUFB ·rol8<>(SB), DD3, DD3 - VPADDD DD0, CC0, CC0; VPADDD DD1, CC1, CC1; VPADDD DD2, CC2, CC2; VPADDD DD3, CC3, CC3 - VPXOR CC0, BB0, BB0; VPXOR CC1, BB1, BB1; VPXOR CC2, BB2, BB2; VPXOR CC3, BB3, BB3 - VMOVDQA CC3, tmpStoreAVX2 - VPSLLD $7, BB0, CC3; VPSRLD $25, BB0, BB0; VPXOR CC3, BB0, BB0 - VPSLLD $7, BB1, CC3; VPSRLD $25, BB1, BB1; VPXOR CC3, BB1, BB1 - VPSLLD $7, BB2, CC3; VPSRLD $25, BB2, BB2; VPXOR CC3, BB2, BB2 - VPSLLD $7, BB3, CC3; VPSRLD $25, BB3, BB3; VPXOR CC3, BB3, BB3 - VMOVDQA tmpStoreAVX2, CC3 - VPALIGNR $12, BB0, BB0, BB0; VPALIGNR $12, BB1, BB1, BB1; VPALIGNR $12, BB2, BB2, BB2; VPALIGNR $12, BB3, BB3, BB3 - VPALIGNR $8, CC0, CC0, CC0; VPALIGNR $8, CC1, CC1, CC1; VPALIGNR $8, CC2, CC2, CC2; VPALIGNR $8, CC3, CC3, CC3 - VPALIGNR $4, DD0, DD0, DD0; VPALIGNR $4, DD1, DD1, DD1; VPALIGNR $4, DD2, DD2, DD2; VPALIGNR $4, DD3, DD3, DD3 - - DECQ itr1 - JG sealAVX2Tail512LoopA - DECQ itr2 - JGE sealAVX2Tail512LoopB - - VPADDD ·chacha20Constants<>(SB), AA0, AA0; VPADDD ·chacha20Constants<>(SB), AA1, AA1; VPADDD ·chacha20Constants<>(SB), AA2, AA2; VPADDD ·chacha20Constants<>(SB), AA3, AA3 - VPADDD state1StoreAVX2, BB0, BB0; VPADDD state1StoreAVX2, BB1, BB1; VPADDD state1StoreAVX2, BB2, BB2; VPADDD state1StoreAVX2, BB3, BB3 - VPADDD state2StoreAVX2, CC0, CC0; VPADDD state2StoreAVX2, CC1, CC1; VPADDD state2StoreAVX2, CC2, CC2; VPADDD state2StoreAVX2, CC3, CC3 - VPADDD ctr0StoreAVX2, DD0, DD0; VPADDD ctr1StoreAVX2, DD1, DD1; VPADDD ctr2StoreAVX2, DD2, DD2; VPADDD ctr3StoreAVX2, DD3, DD3 - VMOVDQA CC3, tmpStoreAVX2 - VPERM2I128 $0x02, AA0, BB0, CC3 - VPXOR (0*32)(inp), CC3, CC3 - VMOVDQU CC3, (0*32)(oup) - VPERM2I128 $0x02, CC0, DD0, CC3 - VPXOR (1*32)(inp), CC3, CC3 - VMOVDQU CC3, (1*32)(oup) - VPERM2I128 $0x13, AA0, BB0, CC3 - VPXOR (2*32)(inp), CC3, CC3 - VMOVDQU CC3, (2*32)(oup) - VPERM2I128 $0x13, CC0, DD0, CC3 - VPXOR (3*32)(inp), CC3, CC3 - VMOVDQU CC3, (3*32)(oup) - - VPERM2I128 $0x02, AA1, BB1, AA0 - VPERM2I128 $0x02, CC1, DD1, BB0 - VPERM2I128 $0x13, AA1, BB1, CC0 - VPERM2I128 $0x13, CC1, DD1, DD0 - VPXOR (4*32)(inp), AA0, AA0; VPXOR (5*32)(inp), BB0, BB0; VPXOR (6*32)(inp), CC0, CC0; VPXOR (7*32)(inp), DD0, DD0 - VMOVDQU AA0, (4*32)(oup); VMOVDQU BB0, (5*32)(oup); VMOVDQU CC0, (6*32)(oup); VMOVDQU DD0, (7*32)(oup) - - VPERM2I128 $0x02, AA2, BB2, AA0 - VPERM2I128 $0x02, CC2, DD2, BB0 - VPERM2I128 $0x13, AA2, BB2, CC0 - VPERM2I128 $0x13, CC2, DD2, DD0 - VPXOR (8*32)(inp), AA0, AA0; VPXOR (9*32)(inp), BB0, BB0; VPXOR (10*32)(inp), CC0, CC0; VPXOR (11*32)(inp), DD0, DD0 - VMOVDQU AA0, (8*32)(oup); VMOVDQU BB0, (9*32)(oup); VMOVDQU CC0, (10*32)(oup); VMOVDQU DD0, (11*32)(oup) - - MOVQ $384, itr1 - LEAQ 384(inp), inp - SUBQ $384, inl - VPERM2I128 $0x02, AA3, BB3, AA0 - VPERM2I128 $0x02, tmpStoreAVX2, DD3, BB0 - VPERM2I128 $0x13, AA3, BB3, CC0 - VPERM2I128 $0x13, tmpStoreAVX2, DD3, DD0 - - JMP sealAVX2SealHash + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + ADDQ (DI), R10 + ADCQ 8(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPALIGNR $0x04, Y14, Y14, Y14 + VPALIGNR $0x04, Y9, Y9, Y9 + VPALIGNR $0x04, Y10, Y10, Y10 + VPALIGNR $0x04, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x0c, Y4, Y4, Y4 + VPALIGNR $0x0c, Y1, Y1, Y1 + VPALIGNR $0x0c, Y2, Y2, Y2 + VPALIGNR $0x0c, Y3, Y3, Y3 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol16<>+0(SB), Y4, Y4 + VPSHUFB ·rol16<>+0(SB), Y1, Y1 + VPSHUFB ·rol16<>+0(SB), Y2, Y2 + VPSHUFB ·rol16<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + ADDQ 16(DI), R10 + ADCQ 24(DI), R11 + ADCQ $0x01, R12 + MOVQ (BP), DX + MOVQ DX, R15 + MULXQ R10, R13, R14 + IMULQ R12, R15 + MULXQ R11, AX, DX + ADDQ AX, R14 + ADCQ DX, R15 + MOVQ 8(BP), DX + MULXQ R10, R10, AX + ADDQ R10, R14 + MULXQ R11, R11, R8 + ADCQ R11, R15 + ADCQ $0x00, R8 + IMULQ R12, DX + ADDQ AX, R15 + ADCQ DX, R8 + MOVQ R13, R10 + MOVQ R14, R11 + MOVQ R15, R12 + ANDQ $0x03, R12 + MOVQ R15, R13 + ANDQ $-4, R13 + MOVQ R8, R14 + SHRQ $0x02, R8, R15 + SHRQ $0x02, R8 + ADDQ R13, R10 + ADCQ R14, R11 + ADCQ $0x00, R12 + ADDQ R15, R10 + ADCQ R8, R11 + ADCQ $0x00, R12 + LEAQ 32(DI), DI + VMOVDQA Y15, 224(BP) + VPSLLD $0x0c, Y14, Y15 + VPSRLD $0x14, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x0c, Y9, Y15 + VPSRLD $0x14, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x0c, Y10, Y15 + VPSRLD $0x14, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x0c, Y11, Y15 + VPSRLD $0x14, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPADDD Y14, Y0, Y0 + VPADDD Y9, Y5, Y5 + VPADDD Y10, Y6, Y6 + VPADDD Y11, Y7, Y7 + VPXOR Y0, Y4, Y4 + VPXOR Y5, Y1, Y1 + VPXOR Y6, Y2, Y2 + VPXOR Y7, Y3, Y3 + VPSHUFB ·rol8<>+0(SB), Y4, Y4 + VPSHUFB ·rol8<>+0(SB), Y1, Y1 + VPSHUFB ·rol8<>+0(SB), Y2, Y2 + VPSHUFB ·rol8<>+0(SB), Y3, Y3 + VPADDD Y4, Y12, Y12 + VPADDD Y1, Y13, Y13 + VPADDD Y2, Y8, Y8 + VPADDD Y3, Y15, Y15 + VPXOR Y12, Y14, Y14 + VPXOR Y13, Y9, Y9 + VPXOR Y8, Y10, Y10 + VPXOR Y15, Y11, Y11 + VMOVDQA Y15, 224(BP) + VPSLLD $0x07, Y14, Y15 + VPSRLD $0x19, Y14, Y14 + VPXOR Y15, Y14, Y14 + VPSLLD $0x07, Y9, Y15 + VPSRLD $0x19, Y9, Y9 + VPXOR Y15, Y9, Y9 + VPSLLD $0x07, Y10, Y15 + VPSRLD $0x19, Y10, Y10 + VPXOR Y15, Y10, Y10 + VPSLLD $0x07, Y11, Y15 + VPSRLD $0x19, Y11, Y11 + VPXOR Y15, Y11, Y11 + VMOVDQA 224(BP), Y15 + VPALIGNR $0x0c, Y14, Y14, Y14 + VPALIGNR $0x0c, Y9, Y9, Y9 + VPALIGNR $0x0c, Y10, Y10, Y10 + VPALIGNR $0x0c, Y11, Y11, Y11 + VPALIGNR $0x08, Y12, Y12, Y12 + VPALIGNR $0x08, Y13, Y13, Y13 + VPALIGNR $0x08, Y8, Y8, Y8 + VPALIGNR $0x08, Y15, Y15, Y15 + VPALIGNR $0x04, Y4, Y4, Y4 + VPALIGNR $0x04, Y1, Y1, Y1 + VPALIGNR $0x04, Y2, Y2, Y2 + VPALIGNR $0x04, Y3, Y3, Y3 + DECQ CX + JG sealAVX2Tail512LoopA + DECQ R9 + JGE sealAVX2Tail512LoopB + VPADDD ·chacha20Constants<>+0(SB), Y0, Y0 + VPADDD ·chacha20Constants<>+0(SB), Y5, Y5 + VPADDD ·chacha20Constants<>+0(SB), Y6, Y6 + VPADDD ·chacha20Constants<>+0(SB), Y7, Y7 + VPADDD 32(BP), Y14, Y14 + VPADDD 32(BP), Y9, Y9 + VPADDD 32(BP), Y10, Y10 + VPADDD 32(BP), Y11, Y11 + VPADDD 64(BP), Y12, Y12 + VPADDD 64(BP), Y13, Y13 + VPADDD 64(BP), Y8, Y8 + VPADDD 64(BP), Y15, Y15 + VPADDD 96(BP), Y4, Y4 + VPADDD 128(BP), Y1, Y1 + VPADDD 160(BP), Y2, Y2 + VPADDD 192(BP), Y3, Y3 + VMOVDQA Y15, 224(BP) + VPERM2I128 $0x02, Y0, Y14, Y15 + VPXOR (SI), Y15, Y15 + VMOVDQU Y15, (DI) + VPERM2I128 $0x02, Y12, Y4, Y15 + VPXOR 32(SI), Y15, Y15 + VMOVDQU Y15, 32(DI) + VPERM2I128 $0x13, Y0, Y14, Y15 + VPXOR 64(SI), Y15, Y15 + VMOVDQU Y15, 64(DI) + VPERM2I128 $0x13, Y12, Y4, Y15 + VPXOR 96(SI), Y15, Y15 + VMOVDQU Y15, 96(DI) + VPERM2I128 $0x02, Y5, Y9, Y0 + VPERM2I128 $0x02, Y13, Y1, Y14 + VPERM2I128 $0x13, Y5, Y9, Y12 + VPERM2I128 $0x13, Y13, Y1, Y4 + VPXOR 128(SI), Y0, Y0 + VPXOR 160(SI), Y14, Y14 + VPXOR 192(SI), Y12, Y12 + VPXOR 224(SI), Y4, Y4 + VMOVDQU Y0, 128(DI) + VMOVDQU Y14, 160(DI) + VMOVDQU Y12, 192(DI) + VMOVDQU Y4, 224(DI) + VPERM2I128 $0x02, Y6, Y10, Y0 + VPERM2I128 $0x02, Y8, Y2, Y14 + VPERM2I128 $0x13, Y6, Y10, Y12 + VPERM2I128 $0x13, Y8, Y2, Y4 + VPXOR 256(SI), Y0, Y0 + VPXOR 288(SI), Y14, Y14 + VPXOR 320(SI), Y12, Y12 + VPXOR 352(SI), Y4, Y4 + VMOVDQU Y0, 256(DI) + VMOVDQU Y14, 288(DI) + VMOVDQU Y12, 320(DI) + VMOVDQU Y4, 352(DI) + MOVQ $0x00000180, CX + LEAQ 384(SI), SI + SUBQ $0x00000180, BX + VPERM2I128 $0x02, Y7, Y11, Y0 + VPERM2I128 $0x02, 224(BP), Y3, Y14 + VPERM2I128 $0x13, Y7, Y11, Y12 + VPERM2I128 $0x13, 224(BP), Y3, Y4 + JMP sealAVX2SealHash diff --git a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s index e0d3c64756..133757384b 100644 --- a/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s +++ b/vendor/golang.org/x/crypto/internal/poly1305/sum_amd64.s @@ -1,108 +1,93 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run sum_amd64_asm.go -out ../sum_amd64.s -pkg poly1305. DO NOT EDIT. //go:build gc && !purego -#include "textflag.h" - -#define POLY1305_ADD(msg, h0, h1, h2) \ - ADDQ 0(msg), h0; \ - ADCQ 8(msg), h1; \ - ADCQ $1, h2; \ - LEAQ 16(msg), msg - -#define POLY1305_MUL(h0, h1, h2, r0, r1, t0, t1, t2, t3) \ - MOVQ r0, AX; \ - MULQ h0; \ - MOVQ AX, t0; \ - MOVQ DX, t1; \ - MOVQ r0, AX; \ - MULQ h1; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ r0, t2; \ - IMULQ h2, t2; \ - ADDQ DX, t2; \ - \ - MOVQ r1, AX; \ - MULQ h0; \ - ADDQ AX, t1; \ - ADCQ $0, DX; \ - MOVQ DX, h0; \ - MOVQ r1, t3; \ - IMULQ h2, t3; \ - MOVQ r1, AX; \ - MULQ h1; \ - ADDQ AX, t2; \ - ADCQ DX, t3; \ - ADDQ h0, t2; \ - ADCQ $0, t3; \ - \ - MOVQ t0, h0; \ - MOVQ t1, h1; \ - MOVQ t2, h2; \ - ANDQ $3, h2; \ - MOVQ t2, t0; \ - ANDQ $0xFFFFFFFFFFFFFFFC, t0; \ - ADDQ t0, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2; \ - SHRQ $2, t3, t2; \ - SHRQ $2, t3; \ - ADDQ t2, h0; \ - ADCQ t3, h1; \ - ADCQ $0, h2 - -// func update(state *[7]uint64, msg []byte) +// func update(state *macState, msg []byte) TEXT ·update(SB), $0-32 MOVQ state+0(FP), DI MOVQ msg_base+8(FP), SI MOVQ msg_len+16(FP), R15 - - MOVQ 0(DI), R8 // h0 - MOVQ 8(DI), R9 // h1 - MOVQ 16(DI), R10 // h2 - MOVQ 24(DI), R11 // r0 - MOVQ 32(DI), R12 // r1 - - CMPQ R15, $16 + MOVQ (DI), R8 + MOVQ 8(DI), R9 + MOVQ 16(DI), R10 + MOVQ 24(DI), R11 + MOVQ 32(DI), R12 + CMPQ R15, $0x10 JB bytes_between_0_and_15 loop: - POLY1305_ADD(SI, R8, R9, R10) + ADDQ (SI), R8 + ADCQ 8(SI), R9 + ADCQ $0x01, R10 + LEAQ 16(SI), SI multiply: - POLY1305_MUL(R8, R9, R10, R11, R12, BX, CX, R13, R14) - SUBQ $16, R15 - CMPQ R15, $16 - JAE loop + MOVQ R11, AX + MULQ R8 + MOVQ AX, BX + MOVQ DX, CX + MOVQ R11, AX + MULQ R9 + ADDQ AX, CX + ADCQ $0x00, DX + MOVQ R11, R13 + IMULQ R10, R13 + ADDQ DX, R13 + MOVQ R12, AX + MULQ R8 + ADDQ AX, CX + ADCQ $0x00, DX + MOVQ DX, R8 + MOVQ R12, R14 + IMULQ R10, R14 + MOVQ R12, AX + MULQ R9 + ADDQ AX, R13 + ADCQ DX, R14 + ADDQ R8, R13 + ADCQ $0x00, R14 + MOVQ BX, R8 + MOVQ CX, R9 + MOVQ R13, R10 + ANDQ $0x03, R10 + MOVQ R13, BX + ANDQ $-4, BX + ADDQ BX, R8 + ADCQ R14, R9 + ADCQ $0x00, R10 + SHRQ $0x02, R14, R13 + SHRQ $0x02, R14 + ADDQ R13, R8 + ADCQ R14, R9 + ADCQ $0x00, R10 + SUBQ $0x10, R15 + CMPQ R15, $0x10 + JAE loop bytes_between_0_and_15: TESTQ R15, R15 JZ done - MOVQ $1, BX + MOVQ $0x00000001, BX XORQ CX, CX XORQ R13, R13 ADDQ R15, SI flush_buffer: - SHLQ $8, BX, CX - SHLQ $8, BX + SHLQ $0x08, BX, CX + SHLQ $0x08, BX MOVB -1(SI), R13 XORQ R13, BX DECQ SI DECQ R15 JNZ flush_buffer - ADDQ BX, R8 ADCQ CX, R9 - ADCQ $0, R10 - MOVQ $16, R15 + ADCQ $0x00, R10 + MOVQ $0x00000010, R15 JMP multiply done: - MOVQ R8, 0(DI) + MOVQ R8, (DI) MOVQ R9, 8(DI) MOVQ R10, 16(DI) RET diff --git a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s index fcce0234b6..3883e0ec22 100644 --- a/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s +++ b/vendor/golang.org/x/crypto/salsa20/salsa/salsa20_amd64.s @@ -1,880 +1,880 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +// Code generated by command: go run salsa20_amd64_asm.go -out ../salsa20_amd64.s -pkg salsa. DO NOT EDIT. //go:build amd64 && !purego && gc -// This code was translated into a form compatible with 6a from the public -// domain sources in SUPERCOP: https://bench.cr.yp.to/supercop.html +// func salsa2020XORKeyStream(out *byte, in *byte, n uint64, nonce *byte, key *byte) +// Requires: SSE2 +TEXT ·salsa2020XORKeyStream(SB), $456-40 + // This needs up to 64 bytes at 360(R12); hence the non-obvious frame size. + MOVQ out+0(FP), DI + MOVQ in+8(FP), SI + MOVQ n+16(FP), DX + MOVQ nonce+24(FP), CX + MOVQ key+32(FP), R8 + MOVQ SP, R12 + ADDQ $0x1f, R12 + ANDQ $-32, R12 + MOVQ DX, R9 + MOVQ CX, DX + MOVQ R8, R10 + CMPQ R9, $0x00 + JBE DONE + MOVL 20(R10), CX + MOVL (R10), R8 + MOVL (DX), AX + MOVL 16(R10), R11 + MOVL CX, (R12) + MOVL R8, 4(R12) + MOVL AX, 8(R12) + MOVL R11, 12(R12) + MOVL 8(DX), CX + MOVL 24(R10), R8 + MOVL 4(R10), AX + MOVL 4(DX), R11 + MOVL CX, 16(R12) + MOVL R8, 20(R12) + MOVL AX, 24(R12) + MOVL R11, 28(R12) + MOVL 12(DX), CX + MOVL 12(R10), DX + MOVL 28(R10), R8 + MOVL 8(R10), AX + MOVL DX, 32(R12) + MOVL CX, 36(R12) + MOVL R8, 40(R12) + MOVL AX, 44(R12) + MOVQ $0x61707865, DX + MOVQ $0x3320646e, CX + MOVQ $0x79622d32, R8 + MOVQ $0x6b206574, AX + MOVL DX, 48(R12) + MOVL CX, 52(R12) + MOVL R8, 56(R12) + MOVL AX, 60(R12) + CMPQ R9, $0x00000100 + JB BYTESBETWEEN1AND255 + MOVOA 48(R12), X0 + PSHUFL $0x55, X0, X1 + PSHUFL $0xaa, X0, X2 + PSHUFL $0xff, X0, X3 + PSHUFL $0x00, X0, X0 + MOVOA X1, 64(R12) + MOVOA X2, 80(R12) + MOVOA X3, 96(R12) + MOVOA X0, 112(R12) + MOVOA (R12), X0 + PSHUFL $0xaa, X0, X1 + PSHUFL $0xff, X0, X2 + PSHUFL $0x00, X0, X3 + PSHUFL $0x55, X0, X0 + MOVOA X1, 128(R12) + MOVOA X2, 144(R12) + MOVOA X3, 160(R12) + MOVOA X0, 176(R12) + MOVOA 16(R12), X0 + PSHUFL $0xff, X0, X1 + PSHUFL $0x55, X0, X2 + PSHUFL $0xaa, X0, X0 + MOVOA X1, 192(R12) + MOVOA X2, 208(R12) + MOVOA X0, 224(R12) + MOVOA 32(R12), X0 + PSHUFL $0x00, X0, X1 + PSHUFL $0xaa, X0, X2 + PSHUFL $0xff, X0, X0 + MOVOA X1, 240(R12) + MOVOA X2, 256(R12) + MOVOA X0, 272(R12) -// func salsa2020XORKeyStream(out, in *byte, n uint64, nonce, key *byte) -// This needs up to 64 bytes at 360(R12); hence the non-obvious frame size. -TEXT ·salsa2020XORKeyStream(SB),0,$456-40 // frame = 424 + 32 byte alignment - MOVQ out+0(FP),DI - MOVQ in+8(FP),SI - MOVQ n+16(FP),DX - MOVQ nonce+24(FP),CX - MOVQ key+32(FP),R8 +BYTESATLEAST256: + MOVL 16(R12), DX + MOVL 36(R12), CX + MOVL DX, 288(R12) + MOVL CX, 304(R12) + SHLQ $0x20, CX + ADDQ CX, DX + ADDQ $0x01, DX + MOVQ DX, CX + SHRQ $0x20, CX + MOVL DX, 292(R12) + MOVL CX, 308(R12) + ADDQ $0x01, DX + MOVQ DX, CX + SHRQ $0x20, CX + MOVL DX, 296(R12) + MOVL CX, 312(R12) + ADDQ $0x01, DX + MOVQ DX, CX + SHRQ $0x20, CX + MOVL DX, 300(R12) + MOVL CX, 316(R12) + ADDQ $0x01, DX + MOVQ DX, CX + SHRQ $0x20, CX + MOVL DX, 16(R12) + MOVL CX, 36(R12) + MOVQ R9, 352(R12) + MOVQ $0x00000014, DX + MOVOA 64(R12), X0 + MOVOA 80(R12), X1 + MOVOA 96(R12), X2 + MOVOA 256(R12), X3 + MOVOA 272(R12), X4 + MOVOA 128(R12), X5 + MOVOA 144(R12), X6 + MOVOA 176(R12), X7 + MOVOA 192(R12), X8 + MOVOA 208(R12), X9 + MOVOA 224(R12), X10 + MOVOA 304(R12), X11 + MOVOA 112(R12), X12 + MOVOA 160(R12), X13 + MOVOA 240(R12), X14 + MOVOA 288(R12), X15 - MOVQ SP,R12 - ADDQ $31, R12 - ANDQ $~31, R12 +MAINLOOP1: + MOVOA X1, 320(R12) + MOVOA X2, 336(R12) + MOVOA X13, X1 + PADDL X12, X1 + MOVOA X1, X2 + PSLLL $0x07, X1 + PXOR X1, X14 + PSRLL $0x19, X2 + PXOR X2, X14 + MOVOA X7, X1 + PADDL X0, X1 + MOVOA X1, X2 + PSLLL $0x07, X1 + PXOR X1, X11 + PSRLL $0x19, X2 + PXOR X2, X11 + MOVOA X12, X1 + PADDL X14, X1 + MOVOA X1, X2 + PSLLL $0x09, X1 + PXOR X1, X15 + PSRLL $0x17, X2 + PXOR X2, X15 + MOVOA X0, X1 + PADDL X11, X1 + MOVOA X1, X2 + PSLLL $0x09, X1 + PXOR X1, X9 + PSRLL $0x17, X2 + PXOR X2, X9 + MOVOA X14, X1 + PADDL X15, X1 + MOVOA X1, X2 + PSLLL $0x0d, X1 + PXOR X1, X13 + PSRLL $0x13, X2 + PXOR X2, X13 + MOVOA X11, X1 + PADDL X9, X1 + MOVOA X1, X2 + PSLLL $0x0d, X1 + PXOR X1, X7 + PSRLL $0x13, X2 + PXOR X2, X7 + MOVOA X15, X1 + PADDL X13, X1 + MOVOA X1, X2 + PSLLL $0x12, X1 + PXOR X1, X12 + PSRLL $0x0e, X2 + PXOR X2, X12 + MOVOA 320(R12), X1 + MOVOA X12, 320(R12) + MOVOA X9, X2 + PADDL X7, X2 + MOVOA X2, X12 + PSLLL $0x12, X2 + PXOR X2, X0 + PSRLL $0x0e, X12 + PXOR X12, X0 + MOVOA X5, X2 + PADDL X1, X2 + MOVOA X2, X12 + PSLLL $0x07, X2 + PXOR X2, X3 + PSRLL $0x19, X12 + PXOR X12, X3 + MOVOA 336(R12), X2 + MOVOA X0, 336(R12) + MOVOA X6, X0 + PADDL X2, X0 + MOVOA X0, X12 + PSLLL $0x07, X0 + PXOR X0, X4 + PSRLL $0x19, X12 + PXOR X12, X4 + MOVOA X1, X0 + PADDL X3, X0 + MOVOA X0, X12 + PSLLL $0x09, X0 + PXOR X0, X10 + PSRLL $0x17, X12 + PXOR X12, X10 + MOVOA X2, X0 + PADDL X4, X0 + MOVOA X0, X12 + PSLLL $0x09, X0 + PXOR X0, X8 + PSRLL $0x17, X12 + PXOR X12, X8 + MOVOA X3, X0 + PADDL X10, X0 + MOVOA X0, X12 + PSLLL $0x0d, X0 + PXOR X0, X5 + PSRLL $0x13, X12 + PXOR X12, X5 + MOVOA X4, X0 + PADDL X8, X0 + MOVOA X0, X12 + PSLLL $0x0d, X0 + PXOR X0, X6 + PSRLL $0x13, X12 + PXOR X12, X6 + MOVOA X10, X0 + PADDL X5, X0 + MOVOA X0, X12 + PSLLL $0x12, X0 + PXOR X0, X1 + PSRLL $0x0e, X12 + PXOR X12, X1 + MOVOA 320(R12), X0 + MOVOA X1, 320(R12) + MOVOA X4, X1 + PADDL X0, X1 + MOVOA X1, X12 + PSLLL $0x07, X1 + PXOR X1, X7 + PSRLL $0x19, X12 + PXOR X12, X7 + MOVOA X8, X1 + PADDL X6, X1 + MOVOA X1, X12 + PSLLL $0x12, X1 + PXOR X1, X2 + PSRLL $0x0e, X12 + PXOR X12, X2 + MOVOA 336(R12), X12 + MOVOA X2, 336(R12) + MOVOA X14, X1 + PADDL X12, X1 + MOVOA X1, X2 + PSLLL $0x07, X1 + PXOR X1, X5 + PSRLL $0x19, X2 + PXOR X2, X5 + MOVOA X0, X1 + PADDL X7, X1 + MOVOA X1, X2 + PSLLL $0x09, X1 + PXOR X1, X10 + PSRLL $0x17, X2 + PXOR X2, X10 + MOVOA X12, X1 + PADDL X5, X1 + MOVOA X1, X2 + PSLLL $0x09, X1 + PXOR X1, X8 + PSRLL $0x17, X2 + PXOR X2, X8 + MOVOA X7, X1 + PADDL X10, X1 + MOVOA X1, X2 + PSLLL $0x0d, X1 + PXOR X1, X4 + PSRLL $0x13, X2 + PXOR X2, X4 + MOVOA X5, X1 + PADDL X8, X1 + MOVOA X1, X2 + PSLLL $0x0d, X1 + PXOR X1, X14 + PSRLL $0x13, X2 + PXOR X2, X14 + MOVOA X10, X1 + PADDL X4, X1 + MOVOA X1, X2 + PSLLL $0x12, X1 + PXOR X1, X0 + PSRLL $0x0e, X2 + PXOR X2, X0 + MOVOA 320(R12), X1 + MOVOA X0, 320(R12) + MOVOA X8, X0 + PADDL X14, X0 + MOVOA X0, X2 + PSLLL $0x12, X0 + PXOR X0, X12 + PSRLL $0x0e, X2 + PXOR X2, X12 + MOVOA X11, X0 + PADDL X1, X0 + MOVOA X0, X2 + PSLLL $0x07, X0 + PXOR X0, X6 + PSRLL $0x19, X2 + PXOR X2, X6 + MOVOA 336(R12), X2 + MOVOA X12, 336(R12) + MOVOA X3, X0 + PADDL X2, X0 + MOVOA X0, X12 + PSLLL $0x07, X0 + PXOR X0, X13 + PSRLL $0x19, X12 + PXOR X12, X13 + MOVOA X1, X0 + PADDL X6, X0 + MOVOA X0, X12 + PSLLL $0x09, X0 + PXOR X0, X15 + PSRLL $0x17, X12 + PXOR X12, X15 + MOVOA X2, X0 + PADDL X13, X0 + MOVOA X0, X12 + PSLLL $0x09, X0 + PXOR X0, X9 + PSRLL $0x17, X12 + PXOR X12, X9 + MOVOA X6, X0 + PADDL X15, X0 + MOVOA X0, X12 + PSLLL $0x0d, X0 + PXOR X0, X11 + PSRLL $0x13, X12 + PXOR X12, X11 + MOVOA X13, X0 + PADDL X9, X0 + MOVOA X0, X12 + PSLLL $0x0d, X0 + PXOR X0, X3 + PSRLL $0x13, X12 + PXOR X12, X3 + MOVOA X15, X0 + PADDL X11, X0 + MOVOA X0, X12 + PSLLL $0x12, X0 + PXOR X0, X1 + PSRLL $0x0e, X12 + PXOR X12, X1 + MOVOA X9, X0 + PADDL X3, X0 + MOVOA X0, X12 + PSLLL $0x12, X0 + PXOR X0, X2 + PSRLL $0x0e, X12 + PXOR X12, X2 + MOVOA 320(R12), X12 + MOVOA 336(R12), X0 + SUBQ $0x02, DX + JA MAINLOOP1 + PADDL 112(R12), X12 + PADDL 176(R12), X7 + PADDL 224(R12), X10 + PADDL 272(R12), X4 + MOVD X12, DX + MOVD X7, CX + MOVD X10, R8 + MOVD X4, R9 + PSHUFL $0x39, X12, X12 + PSHUFL $0x39, X7, X7 + PSHUFL $0x39, X10, X10 + PSHUFL $0x39, X4, X4 + XORL (SI), DX + XORL 4(SI), CX + XORL 8(SI), R8 + XORL 12(SI), R9 + MOVL DX, (DI) + MOVL CX, 4(DI) + MOVL R8, 8(DI) + MOVL R9, 12(DI) + MOVD X12, DX + MOVD X7, CX + MOVD X10, R8 + MOVD X4, R9 + PSHUFL $0x39, X12, X12 + PSHUFL $0x39, X7, X7 + PSHUFL $0x39, X10, X10 + PSHUFL $0x39, X4, X4 + XORL 64(SI), DX + XORL 68(SI), CX + XORL 72(SI), R8 + XORL 76(SI), R9 + MOVL DX, 64(DI) + MOVL CX, 68(DI) + MOVL R8, 72(DI) + MOVL R9, 76(DI) + MOVD X12, DX + MOVD X7, CX + MOVD X10, R8 + MOVD X4, R9 + PSHUFL $0x39, X12, X12 + PSHUFL $0x39, X7, X7 + PSHUFL $0x39, X10, X10 + PSHUFL $0x39, X4, X4 + XORL 128(SI), DX + XORL 132(SI), CX + XORL 136(SI), R8 + XORL 140(SI), R9 + MOVL DX, 128(DI) + MOVL CX, 132(DI) + MOVL R8, 136(DI) + MOVL R9, 140(DI) + MOVD X12, DX + MOVD X7, CX + MOVD X10, R8 + MOVD X4, R9 + XORL 192(SI), DX + XORL 196(SI), CX + XORL 200(SI), R8 + XORL 204(SI), R9 + MOVL DX, 192(DI) + MOVL CX, 196(DI) + MOVL R8, 200(DI) + MOVL R9, 204(DI) + PADDL 240(R12), X14 + PADDL 64(R12), X0 + PADDL 128(R12), X5 + PADDL 192(R12), X8 + MOVD X14, DX + MOVD X0, CX + MOVD X5, R8 + MOVD X8, R9 + PSHUFL $0x39, X14, X14 + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X5, X5 + PSHUFL $0x39, X8, X8 + XORL 16(SI), DX + XORL 20(SI), CX + XORL 24(SI), R8 + XORL 28(SI), R9 + MOVL DX, 16(DI) + MOVL CX, 20(DI) + MOVL R8, 24(DI) + MOVL R9, 28(DI) + MOVD X14, DX + MOVD X0, CX + MOVD X5, R8 + MOVD X8, R9 + PSHUFL $0x39, X14, X14 + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X5, X5 + PSHUFL $0x39, X8, X8 + XORL 80(SI), DX + XORL 84(SI), CX + XORL 88(SI), R8 + XORL 92(SI), R9 + MOVL DX, 80(DI) + MOVL CX, 84(DI) + MOVL R8, 88(DI) + MOVL R9, 92(DI) + MOVD X14, DX + MOVD X0, CX + MOVD X5, R8 + MOVD X8, R9 + PSHUFL $0x39, X14, X14 + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X5, X5 + PSHUFL $0x39, X8, X8 + XORL 144(SI), DX + XORL 148(SI), CX + XORL 152(SI), R8 + XORL 156(SI), R9 + MOVL DX, 144(DI) + MOVL CX, 148(DI) + MOVL R8, 152(DI) + MOVL R9, 156(DI) + MOVD X14, DX + MOVD X0, CX + MOVD X5, R8 + MOVD X8, R9 + XORL 208(SI), DX + XORL 212(SI), CX + XORL 216(SI), R8 + XORL 220(SI), R9 + MOVL DX, 208(DI) + MOVL CX, 212(DI) + MOVL R8, 216(DI) + MOVL R9, 220(DI) + PADDL 288(R12), X15 + PADDL 304(R12), X11 + PADDL 80(R12), X1 + PADDL 144(R12), X6 + MOVD X15, DX + MOVD X11, CX + MOVD X1, R8 + MOVD X6, R9 + PSHUFL $0x39, X15, X15 + PSHUFL $0x39, X11, X11 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X6, X6 + XORL 32(SI), DX + XORL 36(SI), CX + XORL 40(SI), R8 + XORL 44(SI), R9 + MOVL DX, 32(DI) + MOVL CX, 36(DI) + MOVL R8, 40(DI) + MOVL R9, 44(DI) + MOVD X15, DX + MOVD X11, CX + MOVD X1, R8 + MOVD X6, R9 + PSHUFL $0x39, X15, X15 + PSHUFL $0x39, X11, X11 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X6, X6 + XORL 96(SI), DX + XORL 100(SI), CX + XORL 104(SI), R8 + XORL 108(SI), R9 + MOVL DX, 96(DI) + MOVL CX, 100(DI) + MOVL R8, 104(DI) + MOVL R9, 108(DI) + MOVD X15, DX + MOVD X11, CX + MOVD X1, R8 + MOVD X6, R9 + PSHUFL $0x39, X15, X15 + PSHUFL $0x39, X11, X11 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X6, X6 + XORL 160(SI), DX + XORL 164(SI), CX + XORL 168(SI), R8 + XORL 172(SI), R9 + MOVL DX, 160(DI) + MOVL CX, 164(DI) + MOVL R8, 168(DI) + MOVL R9, 172(DI) + MOVD X15, DX + MOVD X11, CX + MOVD X1, R8 + MOVD X6, R9 + XORL 224(SI), DX + XORL 228(SI), CX + XORL 232(SI), R8 + XORL 236(SI), R9 + MOVL DX, 224(DI) + MOVL CX, 228(DI) + MOVL R8, 232(DI) + MOVL R9, 236(DI) + PADDL 160(R12), X13 + PADDL 208(R12), X9 + PADDL 256(R12), X3 + PADDL 96(R12), X2 + MOVD X13, DX + MOVD X9, CX + MOVD X3, R8 + MOVD X2, R9 + PSHUFL $0x39, X13, X13 + PSHUFL $0x39, X9, X9 + PSHUFL $0x39, X3, X3 + PSHUFL $0x39, X2, X2 + XORL 48(SI), DX + XORL 52(SI), CX + XORL 56(SI), R8 + XORL 60(SI), R9 + MOVL DX, 48(DI) + MOVL CX, 52(DI) + MOVL R8, 56(DI) + MOVL R9, 60(DI) + MOVD X13, DX + MOVD X9, CX + MOVD X3, R8 + MOVD X2, R9 + PSHUFL $0x39, X13, X13 + PSHUFL $0x39, X9, X9 + PSHUFL $0x39, X3, X3 + PSHUFL $0x39, X2, X2 + XORL 112(SI), DX + XORL 116(SI), CX + XORL 120(SI), R8 + XORL 124(SI), R9 + MOVL DX, 112(DI) + MOVL CX, 116(DI) + MOVL R8, 120(DI) + MOVL R9, 124(DI) + MOVD X13, DX + MOVD X9, CX + MOVD X3, R8 + MOVD X2, R9 + PSHUFL $0x39, X13, X13 + PSHUFL $0x39, X9, X9 + PSHUFL $0x39, X3, X3 + PSHUFL $0x39, X2, X2 + XORL 176(SI), DX + XORL 180(SI), CX + XORL 184(SI), R8 + XORL 188(SI), R9 + MOVL DX, 176(DI) + MOVL CX, 180(DI) + MOVL R8, 184(DI) + MOVL R9, 188(DI) + MOVD X13, DX + MOVD X9, CX + MOVD X3, R8 + MOVD X2, R9 + XORL 240(SI), DX + XORL 244(SI), CX + XORL 248(SI), R8 + XORL 252(SI), R9 + MOVL DX, 240(DI) + MOVL CX, 244(DI) + MOVL R8, 248(DI) + MOVL R9, 252(DI) + MOVQ 352(R12), R9 + SUBQ $0x00000100, R9 + ADDQ $0x00000100, SI + ADDQ $0x00000100, DI + CMPQ R9, $0x00000100 + JAE BYTESATLEAST256 + CMPQ R9, $0x00 + JBE DONE - MOVQ DX,R9 - MOVQ CX,DX - MOVQ R8,R10 - CMPQ R9,$0 - JBE DONE - START: - MOVL 20(R10),CX - MOVL 0(R10),R8 - MOVL 0(DX),AX - MOVL 16(R10),R11 - MOVL CX,0(R12) - MOVL R8, 4 (R12) - MOVL AX, 8 (R12) - MOVL R11, 12 (R12) - MOVL 8(DX),CX - MOVL 24(R10),R8 - MOVL 4(R10),AX - MOVL 4(DX),R11 - MOVL CX,16(R12) - MOVL R8, 20 (R12) - MOVL AX, 24 (R12) - MOVL R11, 28 (R12) - MOVL 12(DX),CX - MOVL 12(R10),DX - MOVL 28(R10),R8 - MOVL 8(R10),AX - MOVL DX,32(R12) - MOVL CX, 36 (R12) - MOVL R8, 40 (R12) - MOVL AX, 44 (R12) - MOVQ $1634760805,DX - MOVQ $857760878,CX - MOVQ $2036477234,R8 - MOVQ $1797285236,AX - MOVL DX,48(R12) - MOVL CX, 52 (R12) - MOVL R8, 56 (R12) - MOVL AX, 60 (R12) - CMPQ R9,$256 - JB BYTESBETWEEN1AND255 - MOVOA 48(R12),X0 - PSHUFL $0X55,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X3 - PSHUFL $0X00,X0,X0 - MOVOA X1,64(R12) - MOVOA X2,80(R12) - MOVOA X3,96(R12) - MOVOA X0,112(R12) - MOVOA 0(R12),X0 - PSHUFL $0XAA,X0,X1 - PSHUFL $0XFF,X0,X2 - PSHUFL $0X00,X0,X3 - PSHUFL $0X55,X0,X0 - MOVOA X1,128(R12) - MOVOA X2,144(R12) - MOVOA X3,160(R12) - MOVOA X0,176(R12) - MOVOA 16(R12),X0 - PSHUFL $0XFF,X0,X1 - PSHUFL $0X55,X0,X2 - PSHUFL $0XAA,X0,X0 - MOVOA X1,192(R12) - MOVOA X2,208(R12) - MOVOA X0,224(R12) - MOVOA 32(R12),X0 - PSHUFL $0X00,X0,X1 - PSHUFL $0XAA,X0,X2 - PSHUFL $0XFF,X0,X0 - MOVOA X1,240(R12) - MOVOA X2,256(R12) - MOVOA X0,272(R12) - BYTESATLEAST256: - MOVL 16(R12),DX - MOVL 36 (R12),CX - MOVL DX,288(R12) - MOVL CX,304(R12) - SHLQ $32,CX - ADDQ CX,DX - ADDQ $1,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 292 (R12) - MOVL CX, 308 (R12) - ADDQ $1,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 296 (R12) - MOVL CX, 312 (R12) - ADDQ $1,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX, 300 (R12) - MOVL CX, 316 (R12) - ADDQ $1,DX - MOVQ DX,CX - SHRQ $32,CX - MOVL DX,16(R12) - MOVL CX, 36 (R12) - MOVQ R9,352(R12) - MOVQ $20,DX - MOVOA 64(R12),X0 - MOVOA 80(R12),X1 - MOVOA 96(R12),X2 - MOVOA 256(R12),X3 - MOVOA 272(R12),X4 - MOVOA 128(R12),X5 - MOVOA 144(R12),X6 - MOVOA 176(R12),X7 - MOVOA 192(R12),X8 - MOVOA 208(R12),X9 - MOVOA 224(R12),X10 - MOVOA 304(R12),X11 - MOVOA 112(R12),X12 - MOVOA 160(R12),X13 - MOVOA 240(R12),X14 - MOVOA 288(R12),X15 - MAINLOOP1: - MOVOA X1,320(R12) - MOVOA X2,336(R12) - MOVOA X13,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X14 - PSRLL $25,X2 - PXOR X2,X14 - MOVOA X7,X1 - PADDL X0,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X11 - PSRLL $25,X2 - PXOR X2,X11 - MOVOA X12,X1 - PADDL X14,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X15 - PSRLL $23,X2 - PXOR X2,X15 - MOVOA X0,X1 - PADDL X11,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X9 - PSRLL $23,X2 - PXOR X2,X9 - MOVOA X14,X1 - PADDL X15,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X13 - PSRLL $19,X2 - PXOR X2,X13 - MOVOA X11,X1 - PADDL X9,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X7 - PSRLL $19,X2 - PXOR X2,X7 - MOVOA X15,X1 - PADDL X13,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA 320(R12),X1 - MOVOA X12,320(R12) - MOVOA X9,X2 - PADDL X7,X2 - MOVOA X2,X12 - PSLLL $18,X2 - PXOR X2,X0 - PSRLL $14,X12 - PXOR X12,X0 - MOVOA X5,X2 - PADDL X1,X2 - MOVOA X2,X12 - PSLLL $7,X2 - PXOR X2,X3 - PSRLL $25,X12 - PXOR X12,X3 - MOVOA 336(R12),X2 - MOVOA X0,336(R12) - MOVOA X6,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X4 - PSRLL $25,X12 - PXOR X12,X4 - MOVOA X1,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X10 - PSRLL $23,X12 - PXOR X12,X10 - MOVOA X2,X0 - PADDL X4,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X8 - PSRLL $23,X12 - PXOR X12,X8 - MOVOA X3,X0 - PADDL X10,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X5 - PSRLL $19,X12 - PXOR X12,X5 - MOVOA X4,X0 - PADDL X8,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X6 - PSRLL $19,X12 - PXOR X12,X6 - MOVOA X10,X0 - PADDL X5,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA 320(R12),X0 - MOVOA X1,320(R12) - MOVOA X4,X1 - PADDL X0,X1 - MOVOA X1,X12 - PSLLL $7,X1 - PXOR X1,X7 - PSRLL $25,X12 - PXOR X12,X7 - MOVOA X8,X1 - PADDL X6,X1 - MOVOA X1,X12 - PSLLL $18,X1 - PXOR X1,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 336(R12),X12 - MOVOA X2,336(R12) - MOVOA X14,X1 - PADDL X12,X1 - MOVOA X1,X2 - PSLLL $7,X1 - PXOR X1,X5 - PSRLL $25,X2 - PXOR X2,X5 - MOVOA X0,X1 - PADDL X7,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X10 - PSRLL $23,X2 - PXOR X2,X10 - MOVOA X12,X1 - PADDL X5,X1 - MOVOA X1,X2 - PSLLL $9,X1 - PXOR X1,X8 - PSRLL $23,X2 - PXOR X2,X8 - MOVOA X7,X1 - PADDL X10,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X4 - PSRLL $19,X2 - PXOR X2,X4 - MOVOA X5,X1 - PADDL X8,X1 - MOVOA X1,X2 - PSLLL $13,X1 - PXOR X1,X14 - PSRLL $19,X2 - PXOR X2,X14 - MOVOA X10,X1 - PADDL X4,X1 - MOVOA X1,X2 - PSLLL $18,X1 - PXOR X1,X0 - PSRLL $14,X2 - PXOR X2,X0 - MOVOA 320(R12),X1 - MOVOA X0,320(R12) - MOVOA X8,X0 - PADDL X14,X0 - MOVOA X0,X2 - PSLLL $18,X0 - PXOR X0,X12 - PSRLL $14,X2 - PXOR X2,X12 - MOVOA X11,X0 - PADDL X1,X0 - MOVOA X0,X2 - PSLLL $7,X0 - PXOR X0,X6 - PSRLL $25,X2 - PXOR X2,X6 - MOVOA 336(R12),X2 - MOVOA X12,336(R12) - MOVOA X3,X0 - PADDL X2,X0 - MOVOA X0,X12 - PSLLL $7,X0 - PXOR X0,X13 - PSRLL $25,X12 - PXOR X12,X13 - MOVOA X1,X0 - PADDL X6,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X15 - PSRLL $23,X12 - PXOR X12,X15 - MOVOA X2,X0 - PADDL X13,X0 - MOVOA X0,X12 - PSLLL $9,X0 - PXOR X0,X9 - PSRLL $23,X12 - PXOR X12,X9 - MOVOA X6,X0 - PADDL X15,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X11 - PSRLL $19,X12 - PXOR X12,X11 - MOVOA X13,X0 - PADDL X9,X0 - MOVOA X0,X12 - PSLLL $13,X0 - PXOR X0,X3 - PSRLL $19,X12 - PXOR X12,X3 - MOVOA X15,X0 - PADDL X11,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X1 - PSRLL $14,X12 - PXOR X12,X1 - MOVOA X9,X0 - PADDL X3,X0 - MOVOA X0,X12 - PSLLL $18,X0 - PXOR X0,X2 - PSRLL $14,X12 - PXOR X12,X2 - MOVOA 320(R12),X12 - MOVOA 336(R12),X0 - SUBQ $2,DX - JA MAINLOOP1 - PADDL 112(R12),X12 - PADDL 176(R12),X7 - PADDL 224(R12),X10 - PADDL 272(R12),X4 - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 0(SI),DX - XORL 4(SI),CX - XORL 8(SI),R8 - XORL 12(SI),R9 - MOVL DX,0(DI) - MOVL CX,4(DI) - MOVL R8,8(DI) - MOVL R9,12(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 64(SI),DX - XORL 68(SI),CX - XORL 72(SI),R8 - XORL 76(SI),R9 - MOVL DX,64(DI) - MOVL CX,68(DI) - MOVL R8,72(DI) - MOVL R9,76(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - PSHUFL $0X39,X12,X12 - PSHUFL $0X39,X7,X7 - PSHUFL $0X39,X10,X10 - PSHUFL $0X39,X4,X4 - XORL 128(SI),DX - XORL 132(SI),CX - XORL 136(SI),R8 - XORL 140(SI),R9 - MOVL DX,128(DI) - MOVL CX,132(DI) - MOVL R8,136(DI) - MOVL R9,140(DI) - MOVD X12,DX - MOVD X7,CX - MOVD X10,R8 - MOVD X4,R9 - XORL 192(SI),DX - XORL 196(SI),CX - XORL 200(SI),R8 - XORL 204(SI),R9 - MOVL DX,192(DI) - MOVL CX,196(DI) - MOVL R8,200(DI) - MOVL R9,204(DI) - PADDL 240(R12),X14 - PADDL 64(R12),X0 - PADDL 128(R12),X5 - PADDL 192(R12),X8 - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 16(SI),DX - XORL 20(SI),CX - XORL 24(SI),R8 - XORL 28(SI),R9 - MOVL DX,16(DI) - MOVL CX,20(DI) - MOVL R8,24(DI) - MOVL R9,28(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 80(SI),DX - XORL 84(SI),CX - XORL 88(SI),R8 - XORL 92(SI),R9 - MOVL DX,80(DI) - MOVL CX,84(DI) - MOVL R8,88(DI) - MOVL R9,92(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - PSHUFL $0X39,X14,X14 - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X5,X5 - PSHUFL $0X39,X8,X8 - XORL 144(SI),DX - XORL 148(SI),CX - XORL 152(SI),R8 - XORL 156(SI),R9 - MOVL DX,144(DI) - MOVL CX,148(DI) - MOVL R8,152(DI) - MOVL R9,156(DI) - MOVD X14,DX - MOVD X0,CX - MOVD X5,R8 - MOVD X8,R9 - XORL 208(SI),DX - XORL 212(SI),CX - XORL 216(SI),R8 - XORL 220(SI),R9 - MOVL DX,208(DI) - MOVL CX,212(DI) - MOVL R8,216(DI) - MOVL R9,220(DI) - PADDL 288(R12),X15 - PADDL 304(R12),X11 - PADDL 80(R12),X1 - PADDL 144(R12),X6 - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 32(SI),DX - XORL 36(SI),CX - XORL 40(SI),R8 - XORL 44(SI),R9 - MOVL DX,32(DI) - MOVL CX,36(DI) - MOVL R8,40(DI) - MOVL R9,44(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 96(SI),DX - XORL 100(SI),CX - XORL 104(SI),R8 - XORL 108(SI),R9 - MOVL DX,96(DI) - MOVL CX,100(DI) - MOVL R8,104(DI) - MOVL R9,108(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - PSHUFL $0X39,X15,X15 - PSHUFL $0X39,X11,X11 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X6,X6 - XORL 160(SI),DX - XORL 164(SI),CX - XORL 168(SI),R8 - XORL 172(SI),R9 - MOVL DX,160(DI) - MOVL CX,164(DI) - MOVL R8,168(DI) - MOVL R9,172(DI) - MOVD X15,DX - MOVD X11,CX - MOVD X1,R8 - MOVD X6,R9 - XORL 224(SI),DX - XORL 228(SI),CX - XORL 232(SI),R8 - XORL 236(SI),R9 - MOVL DX,224(DI) - MOVL CX,228(DI) - MOVL R8,232(DI) - MOVL R9,236(DI) - PADDL 160(R12),X13 - PADDL 208(R12),X9 - PADDL 256(R12),X3 - PADDL 96(R12),X2 - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 48(SI),DX - XORL 52(SI),CX - XORL 56(SI),R8 - XORL 60(SI),R9 - MOVL DX,48(DI) - MOVL CX,52(DI) - MOVL R8,56(DI) - MOVL R9,60(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 112(SI),DX - XORL 116(SI),CX - XORL 120(SI),R8 - XORL 124(SI),R9 - MOVL DX,112(DI) - MOVL CX,116(DI) - MOVL R8,120(DI) - MOVL R9,124(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - PSHUFL $0X39,X13,X13 - PSHUFL $0X39,X9,X9 - PSHUFL $0X39,X3,X3 - PSHUFL $0X39,X2,X2 - XORL 176(SI),DX - XORL 180(SI),CX - XORL 184(SI),R8 - XORL 188(SI),R9 - MOVL DX,176(DI) - MOVL CX,180(DI) - MOVL R8,184(DI) - MOVL R9,188(DI) - MOVD X13,DX - MOVD X9,CX - MOVD X3,R8 - MOVD X2,R9 - XORL 240(SI),DX - XORL 244(SI),CX - XORL 248(SI),R8 - XORL 252(SI),R9 - MOVL DX,240(DI) - MOVL CX,244(DI) - MOVL R8,248(DI) - MOVL R9,252(DI) - MOVQ 352(R12),R9 - SUBQ $256,R9 - ADDQ $256,SI - ADDQ $256,DI - CMPQ R9,$256 - JAE BYTESATLEAST256 - CMPQ R9,$0 - JBE DONE - BYTESBETWEEN1AND255: - CMPQ R9,$64 - JAE NOCOPY - MOVQ DI,DX - LEAQ 360(R12),DI - MOVQ R9,CX +BYTESBETWEEN1AND255: + CMPQ R9, $0x40 + JAE NOCOPY + MOVQ DI, DX + LEAQ 360(R12), DI + MOVQ R9, CX REP; MOVSB - LEAQ 360(R12),DI - LEAQ 360(R12),SI - NOCOPY: - MOVQ R9,352(R12) - MOVOA 48(R12),X0 - MOVOA 0(R12),X1 - MOVOA 16(R12),X2 - MOVOA 32(R12),X3 - MOVOA X1,X4 - MOVQ $20,CX - MAINLOOP2: - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X3 - PXOR X6,X3 - PADDL X3,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X3,X3 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X1 - PSHUFL $0X4E,X2,X2 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X3,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X1,X1 - PXOR X6,X0 - PADDL X0,X4 - MOVOA X0,X5 - MOVOA X4,X6 - PSLLL $7,X4 - PSRLL $25,X6 - PXOR X4,X1 - PXOR X6,X1 - PADDL X1,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $9,X5 - PSRLL $23,X6 - PXOR X5,X2 - PSHUFL $0X93,X1,X1 - PXOR X6,X2 - PADDL X2,X4 - MOVOA X2,X5 - MOVOA X4,X6 - PSLLL $13,X4 - PSRLL $19,X6 - PXOR X4,X3 - PSHUFL $0X4E,X2,X2 - PXOR X6,X3 - SUBQ $4,CX - PADDL X3,X5 - MOVOA X1,X4 - MOVOA X5,X6 - PSLLL $18,X5 - PXOR X7,X7 - PSRLL $14,X6 - PXOR X5,X0 - PSHUFL $0X39,X3,X3 - PXOR X6,X0 - JA MAINLOOP2 - PADDL 48(R12),X0 - PADDL 0(R12),X1 - PADDL 16(R12),X2 - PADDL 32(R12),X3 - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 0(SI),CX - XORL 48(SI),R8 - XORL 32(SI),R9 - XORL 16(SI),AX - MOVL CX,0(DI) - MOVL R8,48(DI) - MOVL R9,32(DI) - MOVL AX,16(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 20(SI),CX - XORL 4(SI),R8 - XORL 52(SI),R9 - XORL 36(SI),AX - MOVL CX,20(DI) - MOVL R8,4(DI) - MOVL R9,52(DI) - MOVL AX,36(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - PSHUFL $0X39,X0,X0 - PSHUFL $0X39,X1,X1 - PSHUFL $0X39,X2,X2 - PSHUFL $0X39,X3,X3 - XORL 40(SI),CX - XORL 24(SI),R8 - XORL 8(SI),R9 - XORL 56(SI),AX - MOVL CX,40(DI) - MOVL R8,24(DI) - MOVL R9,8(DI) - MOVL AX,56(DI) - MOVD X0,CX - MOVD X1,R8 - MOVD X2,R9 - MOVD X3,AX - XORL 60(SI),CX - XORL 44(SI),R8 - XORL 28(SI),R9 - XORL 12(SI),AX - MOVL CX,60(DI) - MOVL R8,44(DI) - MOVL R9,28(DI) - MOVL AX,12(DI) - MOVQ 352(R12),R9 - MOVL 16(R12),CX - MOVL 36 (R12),R8 - ADDQ $1,CX - SHLQ $32,R8 - ADDQ R8,CX - MOVQ CX,R8 - SHRQ $32,R8 - MOVL CX,16(R12) - MOVL R8, 36 (R12) - CMPQ R9,$64 - JA BYTESATLEAST65 - JAE BYTESATLEAST64 - MOVQ DI,SI - MOVQ DX,DI - MOVQ R9,CX + LEAQ 360(R12), DI + LEAQ 360(R12), SI + +NOCOPY: + MOVQ R9, 352(R12) + MOVOA 48(R12), X0 + MOVOA (R12), X1 + MOVOA 16(R12), X2 + MOVOA 32(R12), X3 + MOVOA X1, X4 + MOVQ $0x00000014, CX + +MAINLOOP2: + PADDL X0, X4 + MOVOA X0, X5 + MOVOA X4, X6 + PSLLL $0x07, X4 + PSRLL $0x19, X6 + PXOR X4, X3 + PXOR X6, X3 + PADDL X3, X5 + MOVOA X3, X4 + MOVOA X5, X6 + PSLLL $0x09, X5 + PSRLL $0x17, X6 + PXOR X5, X2 + PSHUFL $0x93, X3, X3 + PXOR X6, X2 + PADDL X2, X4 + MOVOA X2, X5 + MOVOA X4, X6 + PSLLL $0x0d, X4 + PSRLL $0x13, X6 + PXOR X4, X1 + PSHUFL $0x4e, X2, X2 + PXOR X6, X1 + PADDL X1, X5 + MOVOA X3, X4 + MOVOA X5, X6 + PSLLL $0x12, X5 + PSRLL $0x0e, X6 + PXOR X5, X0 + PSHUFL $0x39, X1, X1 + PXOR X6, X0 + PADDL X0, X4 + MOVOA X0, X5 + MOVOA X4, X6 + PSLLL $0x07, X4 + PSRLL $0x19, X6 + PXOR X4, X1 + PXOR X6, X1 + PADDL X1, X5 + MOVOA X1, X4 + MOVOA X5, X6 + PSLLL $0x09, X5 + PSRLL $0x17, X6 + PXOR X5, X2 + PSHUFL $0x93, X1, X1 + PXOR X6, X2 + PADDL X2, X4 + MOVOA X2, X5 + MOVOA X4, X6 + PSLLL $0x0d, X4 + PSRLL $0x13, X6 + PXOR X4, X3 + PSHUFL $0x4e, X2, X2 + PXOR X6, X3 + PADDL X3, X5 + MOVOA X1, X4 + MOVOA X5, X6 + PSLLL $0x12, X5 + PSRLL $0x0e, X6 + PXOR X5, X0 + PSHUFL $0x39, X3, X3 + PXOR X6, X0 + PADDL X0, X4 + MOVOA X0, X5 + MOVOA X4, X6 + PSLLL $0x07, X4 + PSRLL $0x19, X6 + PXOR X4, X3 + PXOR X6, X3 + PADDL X3, X5 + MOVOA X3, X4 + MOVOA X5, X6 + PSLLL $0x09, X5 + PSRLL $0x17, X6 + PXOR X5, X2 + PSHUFL $0x93, X3, X3 + PXOR X6, X2 + PADDL X2, X4 + MOVOA X2, X5 + MOVOA X4, X6 + PSLLL $0x0d, X4 + PSRLL $0x13, X6 + PXOR X4, X1 + PSHUFL $0x4e, X2, X2 + PXOR X6, X1 + PADDL X1, X5 + MOVOA X3, X4 + MOVOA X5, X6 + PSLLL $0x12, X5 + PSRLL $0x0e, X6 + PXOR X5, X0 + PSHUFL $0x39, X1, X1 + PXOR X6, X0 + PADDL X0, X4 + MOVOA X0, X5 + MOVOA X4, X6 + PSLLL $0x07, X4 + PSRLL $0x19, X6 + PXOR X4, X1 + PXOR X6, X1 + PADDL X1, X5 + MOVOA X1, X4 + MOVOA X5, X6 + PSLLL $0x09, X5 + PSRLL $0x17, X6 + PXOR X5, X2 + PSHUFL $0x93, X1, X1 + PXOR X6, X2 + PADDL X2, X4 + MOVOA X2, X5 + MOVOA X4, X6 + PSLLL $0x0d, X4 + PSRLL $0x13, X6 + PXOR X4, X3 + PSHUFL $0x4e, X2, X2 + PXOR X6, X3 + SUBQ $0x04, CX + PADDL X3, X5 + MOVOA X1, X4 + MOVOA X5, X6 + PSLLL $0x12, X5 + PXOR X7, X7 + PSRLL $0x0e, X6 + PXOR X5, X0 + PSHUFL $0x39, X3, X3 + PXOR X6, X0 + JA MAINLOOP2 + PADDL 48(R12), X0 + PADDL (R12), X1 + PADDL 16(R12), X2 + PADDL 32(R12), X3 + MOVD X0, CX + MOVD X1, R8 + MOVD X2, R9 + MOVD X3, AX + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X2, X2 + PSHUFL $0x39, X3, X3 + XORL (SI), CX + XORL 48(SI), R8 + XORL 32(SI), R9 + XORL 16(SI), AX + MOVL CX, (DI) + MOVL R8, 48(DI) + MOVL R9, 32(DI) + MOVL AX, 16(DI) + MOVD X0, CX + MOVD X1, R8 + MOVD X2, R9 + MOVD X3, AX + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X2, X2 + PSHUFL $0x39, X3, X3 + XORL 20(SI), CX + XORL 4(SI), R8 + XORL 52(SI), R9 + XORL 36(SI), AX + MOVL CX, 20(DI) + MOVL R8, 4(DI) + MOVL R9, 52(DI) + MOVL AX, 36(DI) + MOVD X0, CX + MOVD X1, R8 + MOVD X2, R9 + MOVD X3, AX + PSHUFL $0x39, X0, X0 + PSHUFL $0x39, X1, X1 + PSHUFL $0x39, X2, X2 + PSHUFL $0x39, X3, X3 + XORL 40(SI), CX + XORL 24(SI), R8 + XORL 8(SI), R9 + XORL 56(SI), AX + MOVL CX, 40(DI) + MOVL R8, 24(DI) + MOVL R9, 8(DI) + MOVL AX, 56(DI) + MOVD X0, CX + MOVD X1, R8 + MOVD X2, R9 + MOVD X3, AX + XORL 60(SI), CX + XORL 44(SI), R8 + XORL 28(SI), R9 + XORL 12(SI), AX + MOVL CX, 60(DI) + MOVL R8, 44(DI) + MOVL R9, 28(DI) + MOVL AX, 12(DI) + MOVQ 352(R12), R9 + MOVL 16(R12), CX + MOVL 36(R12), R8 + ADDQ $0x01, CX + SHLQ $0x20, R8 + ADDQ R8, CX + MOVQ CX, R8 + SHRQ $0x20, R8 + MOVL CX, 16(R12) + MOVL R8, 36(R12) + CMPQ R9, $0x40 + JA BYTESATLEAST65 + JAE BYTESATLEAST64 + MOVQ DI, SI + MOVQ DX, DI + MOVQ R9, CX REP; MOVSB - BYTESATLEAST64: - DONE: + +BYTESATLEAST64: +DONE: RET - BYTESATLEAST65: - SUBQ $64,R9 - ADDQ $64,DI - ADDQ $64,SI - JMP BYTESBETWEEN1AND255 + +BYTESATLEAST65: + SUBQ $0x40, R9 + ADDQ $0x40, DI + ADDQ $0x40, SI + JMP BYTESBETWEEN1AND255 diff --git a/vendor/golang.org/x/crypto/ssh/agent/keyring.go b/vendor/golang.org/x/crypto/ssh/agent/keyring.go index 21bfa870fa..c1b4361087 100644 --- a/vendor/golang.org/x/crypto/ssh/agent/keyring.go +++ b/vendor/golang.org/x/crypto/ssh/agent/keyring.go @@ -175,6 +175,15 @@ func (r *keyring) Add(key AddedKey) error { p.expire = &t } + // If we already have a Signer with the same public key, replace it with the + // new one. + for idx, k := range r.keys { + if bytes.Equal(k.signer.PublicKey().Marshal(), p.signer.PublicKey().Marshal()) { + r.keys[idx] = p + return nil + } + } + r.keys = append(r.keys, p) return nil diff --git a/vendor/golang.org/x/crypto/ssh/keys.go b/vendor/golang.org/x/crypto/ssh/keys.go index 7967665f17..98e6706d5d 100644 --- a/vendor/golang.org/x/crypto/ssh/keys.go +++ b/vendor/golang.org/x/crypto/ssh/keys.go @@ -488,7 +488,49 @@ func (r *rsaPublicKey) Verify(data []byte, sig *Signature) error { h := hash.New() h.Write(data) digest := h.Sum(nil) - return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, sig.Blob) + + // Signatures in PKCS1v15 must match the key's modulus in + // length. However with SSH, some signers provide RSA + // signatures which are missing the MSB 0's of the bignum + // represented. With ssh-rsa signatures, this is encouraged by + // the spec (even though e.g. OpenSSH will give the full + // length unconditionally). With rsa-sha2-* signatures, the + // verifier is allowed to support these, even though they are + // out of spec. See RFC 4253 Section 6.6 for ssh-rsa and RFC + // 8332 Section 3 for rsa-sha2-* details. + // + // In practice: + // * OpenSSH always allows "short" signatures: + // https://github.com/openssh/openssh-portable/blob/V_9_8_P1/ssh-rsa.c#L526 + // but always generates padded signatures: + // https://github.com/openssh/openssh-portable/blob/V_9_8_P1/ssh-rsa.c#L439 + // + // * PuTTY versions 0.81 and earlier will generate short + // signatures for all RSA signature variants. Note that + // PuTTY is embedded in other software, such as WinSCP and + // FileZilla. At the time of writing, a patch has been + // applied to PuTTY to generate padded signatures for + // rsa-sha2-*, but not yet released: + // https://git.tartarus.org/?p=simon/putty.git;a=commitdiff;h=a5bcf3d384e1bf15a51a6923c3724cbbee022d8e + // + // * SSH.NET versions 2024.0.0 and earlier will generate short + // signatures for all RSA signature variants, fixed in 2024.1.0: + // https://github.com/sshnet/SSH.NET/releases/tag/2024.1.0 + // + // As a result, we pad these up to the key size by inserting + // leading 0's. + // + // Note that support for short signatures with rsa-sha2-* may + // be removed in the future due to such signatures not being + // allowed by the spec. + blob := sig.Blob + keySize := (*rsa.PublicKey)(r).Size() + if len(blob) < keySize { + padded := make([]byte, keySize) + copy(padded[keySize-len(blob):], blob) + blob = padded + } + return rsa.VerifyPKCS1v15((*rsa.PublicKey)(r), hash, digest, blob) } func (r *rsaPublicKey) CryptoPublicKey() crypto.PublicKey { diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 3ca9e89e22..c0d1c29e6f 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -510,8 +510,8 @@ userAuthLoop: if err := s.transport.writePacket(Marshal(discMsg)); err != nil { return nil, err } - - return nil, discMsg + authErrs = append(authErrs, discMsg) + return nil, &ServerAuthError{Errors: authErrs} } var userAuthReq userAuthRequestMsg diff --git a/vendor/golang.org/x/sync/LICENSE b/vendor/golang.org/x/sync/LICENSE index 6a66aea5ea..2a7cf70da6 100644 --- a/vendor/golang.org/x/sync/LICENSE +++ b/vendor/golang.org/x/sync/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/golang.org/x/sys/LICENSE b/vendor/golang.org/x/sys/LICENSE index 6a66aea5ea..2a7cf70da6 100644 --- a/vendor/golang.org/x/sys/LICENSE +++ b/vendor/golang.org/x/sys/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/golang.org/x/sys/cpu/cpu.go b/vendor/golang.org/x/sys/cpu/cpu.go index 8fa707aa4b..02609d5b21 100644 --- a/vendor/golang.org/x/sys/cpu/cpu.go +++ b/vendor/golang.org/x/sys/cpu/cpu.go @@ -105,6 +105,8 @@ var ARM64 struct { HasSVE bool // Scalable Vector Extensions HasSVE2 bool // Scalable Vector Extensions 2 HasASIMDFHM bool // Advanced SIMD multiplication FP16 to FP32 + HasDIT bool // Data Independent Timing support + HasI8MM bool // Advanced SIMD Int8 matrix multiplication instructions _ CacheLinePad } @@ -199,6 +201,25 @@ var S390X struct { _ CacheLinePad } +// RISCV64 contains the supported CPU features and performance characteristics for riscv64 +// platforms. The booleans in RISCV64, with the exception of HasFastMisaligned, indicate +// the presence of RISC-V extensions. +// +// It is safe to assume that all the RV64G extensions are supported and so they are omitted from +// this structure. As riscv64 Go programs require at least RV64G, the code that populates +// this structure cannot run successfully if some of the RV64G extensions are missing. +// The struct is padded to avoid false sharing. +var RISCV64 struct { + _ CacheLinePad + HasFastMisaligned bool // Fast misaligned accesses + HasC bool // Compressed instruction-set extension + HasV bool // Vector extension compatible with RVV 1.0 + HasZba bool // Address generation instructions extension + HasZbb bool // Basic bit-manipulation extension + HasZbs bool // Single-bit instructions extension + _ CacheLinePad +} + func init() { archInit() initOptions() diff --git a/vendor/golang.org/x/sys/cpu/cpu_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_arm64.go index 0e27a21e1f..af2aa99f9f 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_arm64.go @@ -38,6 +38,8 @@ func initOptions() { {Name: "dcpop", Feature: &ARM64.HasDCPOP}, {Name: "asimddp", Feature: &ARM64.HasASIMDDP}, {Name: "asimdfhm", Feature: &ARM64.HasASIMDFHM}, + {Name: "dit", Feature: &ARM64.HasDIT}, + {Name: "i8mm", Feature: &ARM64.HasI8MM}, } } @@ -145,6 +147,11 @@ func parseARM64SystemRegisters(isar0, isar1, pfr0 uint64) { ARM64.HasLRCPC = true } + switch extractBits(isar1, 52, 55) { + case 1: + ARM64.HasI8MM = true + } + // ID_AA64PFR0_EL1 switch extractBits(pfr0, 16, 19) { case 0: @@ -168,6 +175,11 @@ func parseARM64SystemRegisters(isar0, isar1, pfr0 uint64) { parseARM64SVERegister(getzfr0()) } + + switch extractBits(pfr0, 48, 51) { + case 1: + ARM64.HasDIT = true + } } func parseARM64SVERegister(zfr0 uint64) { diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go index 3d386d0fc2..08f35ea177 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_arm64.go @@ -35,8 +35,10 @@ const ( hwcap_SHA512 = 1 << 21 hwcap_SVE = 1 << 22 hwcap_ASIMDFHM = 1 << 23 + hwcap_DIT = 1 << 24 hwcap2_SVE2 = 1 << 1 + hwcap2_I8MM = 1 << 13 ) // linuxKernelCanEmulateCPUID reports whether we're running @@ -106,9 +108,12 @@ func doinit() { ARM64.HasSHA512 = isSet(hwCap, hwcap_SHA512) ARM64.HasSVE = isSet(hwCap, hwcap_SVE) ARM64.HasASIMDFHM = isSet(hwCap, hwcap_ASIMDFHM) + ARM64.HasDIT = isSet(hwCap, hwcap_DIT) + // HWCAP2 feature bits ARM64.HasSVE2 = isSet(hwCap2, hwcap2_SVE2) + ARM64.HasI8MM = isSet(hwCap2, hwcap2_I8MM) } func isSet(hwc uint, value uint) bool { diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go index cd63e73355..7d902b6847 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_noinit.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x +//go:build linux && !arm && !arm64 && !mips64 && !mips64le && !ppc64 && !ppc64le && !s390x && !riscv64 package cpu diff --git a/vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go new file mode 100644 index 0000000000..cb4a0c5728 --- /dev/null +++ b/vendor/golang.org/x/sys/cpu/cpu_linux_riscv64.go @@ -0,0 +1,137 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package cpu + +import ( + "syscall" + "unsafe" +) + +// RISC-V extension discovery code for Linux. The approach here is to first try the riscv_hwprobe +// syscall falling back to HWCAP to check for the C extension if riscv_hwprobe is not available. +// +// A note on detection of the Vector extension using HWCAP. +// +// Support for the Vector extension version 1.0 was added to the Linux kernel in release 6.5. +// Support for the riscv_hwprobe syscall was added in 6.4. It follows that if the riscv_hwprobe +// syscall is not available then neither is the Vector extension (which needs kernel support). +// The riscv_hwprobe syscall should then be all we need to detect the Vector extension. +// However, some RISC-V board manufacturers ship boards with an older kernel on top of which +// they have back-ported various versions of the Vector extension patches but not the riscv_hwprobe +// patches. These kernels advertise support for the Vector extension using HWCAP. Falling +// back to HWCAP to detect the Vector extension, if riscv_hwprobe is not available, or simply not +// bothering with riscv_hwprobe at all and just using HWCAP may then seem like an attractive option. +// +// Unfortunately, simply checking the 'V' bit in AT_HWCAP will not work as this bit is used by +// RISC-V board and cloud instance providers to mean different things. The Lichee Pi 4A board +// and the Scaleway RV1 cloud instances use the 'V' bit to advertise their support for the unratified +// 0.7.1 version of the Vector Specification. The Banana Pi BPI-F3 and the CanMV-K230 board use +// it to advertise support for 1.0 of the Vector extension. Versions 0.7.1 and 1.0 of the Vector +// extension are binary incompatible. HWCAP can then not be used in isolation to populate the +// HasV field as this field indicates that the underlying CPU is compatible with RVV 1.0. +// +// There is a way at runtime to distinguish between versions 0.7.1 and 1.0 of the Vector +// specification by issuing a RVV 1.0 vsetvli instruction and checking the vill bit of the vtype +// register. This check would allow us to safely detect version 1.0 of the Vector extension +// with HWCAP, if riscv_hwprobe were not available. However, the check cannot +// be added until the assembler supports the Vector instructions. +// +// Note the riscv_hwprobe syscall does not suffer from these ambiguities by design as all of the +// extensions it advertises support for are explicitly versioned. It's also worth noting that +// the riscv_hwprobe syscall is the only way to detect multi-letter RISC-V extensions, e.g., Zba. +// These cannot be detected using HWCAP and so riscv_hwprobe must be used to detect the majority +// of RISC-V extensions. +// +// Please see https://docs.kernel.org/arch/riscv/hwprobe.html for more information. + +// golang.org/x/sys/cpu is not allowed to depend on golang.org/x/sys/unix so we must +// reproduce the constants, types and functions needed to make the riscv_hwprobe syscall +// here. + +const ( + // Copied from golang.org/x/sys/unix/ztypes_linux_riscv64.go. + riscv_HWPROBE_KEY_IMA_EXT_0 = 0x4 + riscv_HWPROBE_IMA_C = 0x2 + riscv_HWPROBE_IMA_V = 0x4 + riscv_HWPROBE_EXT_ZBA = 0x8 + riscv_HWPROBE_EXT_ZBB = 0x10 + riscv_HWPROBE_EXT_ZBS = 0x20 + riscv_HWPROBE_KEY_CPUPERF_0 = 0x5 + riscv_HWPROBE_MISALIGNED_FAST = 0x3 + riscv_HWPROBE_MISALIGNED_MASK = 0x7 +) + +const ( + // sys_RISCV_HWPROBE is copied from golang.org/x/sys/unix/zsysnum_linux_riscv64.go. + sys_RISCV_HWPROBE = 258 +) + +// riscvHWProbePairs is copied from golang.org/x/sys/unix/ztypes_linux_riscv64.go. +type riscvHWProbePairs struct { + key int64 + value uint64 +} + +const ( + // CPU features + hwcap_RISCV_ISA_C = 1 << ('C' - 'A') +) + +func doinit() { + // A slice of key/value pair structures is passed to the RISCVHWProbe syscall. The key + // field should be initialised with one of the key constants defined above, e.g., + // RISCV_HWPROBE_KEY_IMA_EXT_0. The syscall will set the value field to the appropriate value. + // If the kernel does not recognise a key it will set the key field to -1 and the value field to 0. + + pairs := []riscvHWProbePairs{ + {riscv_HWPROBE_KEY_IMA_EXT_0, 0}, + {riscv_HWPROBE_KEY_CPUPERF_0, 0}, + } + + // This call only indicates that extensions are supported if they are implemented on all cores. + if riscvHWProbe(pairs, 0) { + if pairs[0].key != -1 { + v := uint(pairs[0].value) + RISCV64.HasC = isSet(v, riscv_HWPROBE_IMA_C) + RISCV64.HasV = isSet(v, riscv_HWPROBE_IMA_V) + RISCV64.HasZba = isSet(v, riscv_HWPROBE_EXT_ZBA) + RISCV64.HasZbb = isSet(v, riscv_HWPROBE_EXT_ZBB) + RISCV64.HasZbs = isSet(v, riscv_HWPROBE_EXT_ZBS) + } + if pairs[1].key != -1 { + v := pairs[1].value & riscv_HWPROBE_MISALIGNED_MASK + RISCV64.HasFastMisaligned = v == riscv_HWPROBE_MISALIGNED_FAST + } + } + + // Let's double check with HWCAP if the C extension does not appear to be supported. + // This may happen if we're running on a kernel older than 6.4. + + if !RISCV64.HasC { + RISCV64.HasC = isSet(hwCap, hwcap_RISCV_ISA_C) + } +} + +func isSet(hwc uint, value uint) bool { + return hwc&value != 0 +} + +// riscvHWProbe is a simplified version of the generated wrapper function found in +// golang.org/x/sys/unix/zsyscall_linux_riscv64.go. We simplify it by removing the +// cpuCount and cpus parameters which we do not need. We always want to pass 0 for +// these parameters here so the kernel only reports the extensions that are present +// on all cores. +func riscvHWProbe(pairs []riscvHWProbePairs, flags uint) bool { + var _zero uintptr + var p0 unsafe.Pointer + if len(pairs) > 0 { + p0 = unsafe.Pointer(&pairs[0]) + } else { + p0 = unsafe.Pointer(&_zero) + } + + _, _, e1 := syscall.Syscall6(sys_RISCV_HWPROBE, uintptr(p0), uintptr(len(pairs)), uintptr(0), uintptr(0), uintptr(flags), 0) + return e1 == 0 +} diff --git a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go index 7f0c79c004..aca3199c91 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_riscv64.go +++ b/vendor/golang.org/x/sys/cpu/cpu_riscv64.go @@ -8,4 +8,13 @@ package cpu const cacheLineSize = 64 -func initOptions() {} +func initOptions() { + options = []option{ + {Name: "fastmisaligned", Feature: &RISCV64.HasFastMisaligned}, + {Name: "c", Feature: &RISCV64.HasC}, + {Name: "v", Feature: &RISCV64.HasV}, + {Name: "zba", Feature: &RISCV64.HasZba}, + {Name: "zbb", Feature: &RISCV64.HasZbb}, + {Name: "zbs", Feature: &RISCV64.HasZbs}, + } +} diff --git a/vendor/golang.org/x/sys/unix/README.md b/vendor/golang.org/x/sys/unix/README.md index 7d3c060e12..6e08a76a71 100644 --- a/vendor/golang.org/x/sys/unix/README.md +++ b/vendor/golang.org/x/sys/unix/README.md @@ -156,7 +156,7 @@ from the generated architecture-specific files listed below, and merge these into a common file for each OS. The merge is performed in the following steps: -1. Construct the set of common code that is idential in all architecture-specific files. +1. Construct the set of common code that is identical in all architecture-specific files. 2. Write this common code to the merged file. 3. Remove the common code from all architecture-specific files. diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 4ed2e488b6..ac54ecaba0 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -58,6 +58,7 @@ includes_Darwin=' #define _DARWIN_USE_64_BIT_INODE #define __APPLE_USE_RFC_3542 #include +#include #include #include #include @@ -551,6 +552,7 @@ ccflags="$@" $2 !~ /^RTC_VL_(ACCURACY|BACKUP|DATA)/ && $2 ~ /^(NETLINK|NLM|NLMSG|NLA|IFA|IFAN|RT|RTC|RTCF|RTN|RTPROT|RTNH|ARPHRD|ETH_P|NETNSA)_/ || $2 ~ /^SOCK_|SK_DIAG_|SKNLGRP_$/ || + $2 ~ /^(CONNECT|SAE)_/ || $2 ~ /^FIORDCHK$/ || $2 ~ /^SIOC/ || $2 ~ /^TIOC/ || @@ -654,7 +656,7 @@ errors=$( signals=$( echo '#include ' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print $2 }' | - grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' | + grep -E -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | sort ) @@ -664,7 +666,7 @@ echo '#include ' | $CC -x c - -E -dM $ccflags | sort >_error.grep echo '#include ' | $CC -x c - -E -dM $ccflags | awk '$1=="#define" && $2 ~ /^SIG[A-Z0-9]+$/ { print "^\t" $2 "[ \t]*=" }' | - grep -v 'SIGSTKSIZE\|SIGSTKSZ\|SIGRT\|SIGMAX64' | + grep -E -v '(SIGSTKSIZE|SIGSTKSZ|SIGRT|SIGMAX64)' | sort >_signal.grep echo '// mkerrors.sh' "$@" diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index 67ce6cef2d..6f15ba1eaf 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -360,7 +360,7 @@ func Wait4(pid int, wstatus *WaitStatus, options int, rusage *Rusage) (wpid int, var status _C_int var r Pid_t err = ERESTART - // AIX wait4 may return with ERESTART errno, while the processus is still + // AIX wait4 may return with ERESTART errno, while the process is still // active. for err == ERESTART { r, err = wait4(Pid_t(pid), &status, options, rusage) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 4cc7b00596..099867deed 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -402,6 +402,18 @@ func IoctlSetIfreqMTU(fd int, ifreq *IfreqMTU) error { return ioctlPtr(fd, SIOCSIFMTU, unsafe.Pointer(ifreq)) } +//sys renamexNp(from string, to string, flag uint32) (err error) + +func RenamexNp(from string, to string, flag uint32) (err error) { + return renamexNp(from, to, flag) +} + +//sys renameatxNp(fromfd int, from string, tofd int, to string, flag uint32) (err error) + +func RenameatxNp(fromfd int, from string, tofd int, to string, flag uint32) (err error) { + return renameatxNp(fromfd, from, tofd, to, flag) +} + //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS_SYSCTL func Uname(uname *Utsname) error { @@ -554,6 +566,43 @@ func PthreadFchdir(fd int) (err error) { return pthread_fchdir_np(fd) } +// Connectx calls connectx(2) to initiate a connection on a socket. +// +// srcIf, srcAddr, and dstAddr are filled into a [SaEndpoints] struct and passed as the endpoints argument. +// +// - srcIf is the optional source interface index. 0 means unspecified. +// - srcAddr is the optional source address. nil means unspecified. +// - dstAddr is the destination address. +// +// On success, Connectx returns the number of bytes enqueued for transmission. +func Connectx(fd int, srcIf uint32, srcAddr, dstAddr Sockaddr, associd SaeAssocID, flags uint32, iov []Iovec, connid *SaeConnID) (n uintptr, err error) { + endpoints := SaEndpoints{ + Srcif: srcIf, + } + + if srcAddr != nil { + addrp, addrlen, err := srcAddr.sockaddr() + if err != nil { + return 0, err + } + endpoints.Srcaddr = (*RawSockaddr)(addrp) + endpoints.Srcaddrlen = uint32(addrlen) + } + + if dstAddr != nil { + addrp, addrlen, err := dstAddr.sockaddr() + if err != nil { + return 0, err + } + endpoints.Dstaddr = (*RawSockaddr)(addrp) + endpoints.Dstaddrlen = uint32(addrlen) + } + + err = connectx(fd, &endpoints, associd, flags, iov, &n, connid) + return +} + +//sys connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error) //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) //sys shmat(id int, addr uintptr, flag int) (ret uintptr, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_hurd.go b/vendor/golang.org/x/sys/unix/syscall_hurd.go index ba46651f8e..a6a2d2fc2b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_hurd.go +++ b/vendor/golang.org/x/sys/unix/syscall_hurd.go @@ -11,6 +11,7 @@ package unix int ioctl(int, unsigned long int, uintptr_t); */ import "C" +import "unsafe" func ioctl(fd int, req uint, arg uintptr) (err error) { r0, er := C.ioctl(C.int(fd), C.ulong(req), C.uintptr_t(arg)) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 5682e2628a..f08abd434f 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1295,6 +1295,48 @@ func GetsockoptTCPInfo(fd, level, opt int) (*TCPInfo, error) { return &value, err } +// GetsockoptTCPCCVegasInfo returns algorithm specific congestion control information for a socket using the "vegas" +// algorithm. +// +// The socket's congestion control algorighm can be retrieved via [GetsockoptString] with the [TCP_CONGESTION] option: +// +// algo, err := unix.GetsockoptString(fd, unix.IPPROTO_TCP, unix.TCP_CONGESTION) +func GetsockoptTCPCCVegasInfo(fd, level, opt int) (*TCPVegasInfo, error) { + var value [SizeofTCPCCInfo / 4]uint32 // ensure proper alignment + vallen := _Socklen(SizeofTCPCCInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + out := (*TCPVegasInfo)(unsafe.Pointer(&value[0])) + return out, err +} + +// GetsockoptTCPCCDCTCPInfo returns algorithm specific congestion control information for a socket using the "dctp" +// algorithm. +// +// The socket's congestion control algorighm can be retrieved via [GetsockoptString] with the [TCP_CONGESTION] option: +// +// algo, err := unix.GetsockoptString(fd, unix.IPPROTO_TCP, unix.TCP_CONGESTION) +func GetsockoptTCPCCDCTCPInfo(fd, level, opt int) (*TCPDCTCPInfo, error) { + var value [SizeofTCPCCInfo / 4]uint32 // ensure proper alignment + vallen := _Socklen(SizeofTCPCCInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + out := (*TCPDCTCPInfo)(unsafe.Pointer(&value[0])) + return out, err +} + +// GetsockoptTCPCCBBRInfo returns algorithm specific congestion control information for a socket using the "bbr" +// algorithm. +// +// The socket's congestion control algorighm can be retrieved via [GetsockoptString] with the [TCP_CONGESTION] option: +// +// algo, err := unix.GetsockoptString(fd, unix.IPPROTO_TCP, unix.TCP_CONGESTION) +func GetsockoptTCPCCBBRInfo(fd, level, opt int) (*TCPBBRInfo, error) { + var value [SizeofTCPCCInfo / 4]uint32 // ensure proper alignment + vallen := _Socklen(SizeofTCPCCInfo) + err := getsockopt(fd, level, opt, unsafe.Pointer(&value[0]), &vallen) + out := (*TCPBBRInfo)(unsafe.Pointer(&value[0])) + return out, err +} + // GetsockoptString returns the string value of the socket option opt for the // socket associated with fd at the given socket level. func GetsockoptString(fd, level, opt int) (string, error) { @@ -1959,7 +2001,26 @@ func Getpgrp() (pid int) { //sysnb Getpid() (pid int) //sysnb Getppid() (ppid int) //sys Getpriority(which int, who int) (prio int, err error) -//sys Getrandom(buf []byte, flags int) (n int, err error) + +func Getrandom(buf []byte, flags int) (n int, err error) { + vdsoRet, supported := vgetrandom(buf, uint32(flags)) + if supported { + if vdsoRet < 0 { + return 0, errnoErr(syscall.Errno(-vdsoRet)) + } + return vdsoRet, nil + } + var p *byte + if len(buf) > 0 { + p = &buf[0] + } + r, _, e := Syscall(SYS_GETRANDOM, uintptr(unsafe.Pointer(p)), uintptr(len(buf)), uintptr(flags)) + if e != 0 { + return 0, errnoErr(e) + } + return int(r), nil +} + //sysnb Getrusage(who int, rusage *Rusage) (err error) //sysnb Getsid(pid int) (sid int, err error) //sysnb Gettid() (tid int) @@ -2592,3 +2653,4 @@ func SchedGetAttr(pid int, flags uint) (*SchedAttr, error) { } //sys Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) (err error) +//sys Mseal(b []byte, flags uint) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index cf2ee6c75e..745e5c7e6c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -182,3 +182,5 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +const SYS_FSTATAT = SYS_NEWFSTATAT diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 3d0e98451f..dd2262a407 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -214,3 +214,5 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +const SYS_FSTATAT = SYS_NEWFSTATAT diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 6f5a288944..8cf3670bda 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -187,3 +187,5 @@ func RISCVHWProbe(pairs []RISCVHWProbePairs, set *CPUSet, flags uint) (err error } return riscvHWProbe(pairs, setSize, set, flags) } + +const SYS_FSTATAT = SYS_NEWFSTATAT diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index b25343c71a..b86ded549c 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -293,6 +293,7 @@ func Uname(uname *Utsname) error { //sys Mkfifoat(dirfd int, path string, mode uint32) (err error) //sys Mknod(path string, mode uint32, dev int) (err error) //sys Mknodat(dirfd int, path string, mode uint32, dev int) (err error) +//sys Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) //sys Nanosleep(time *Timespec, leftover *Timespec) (err error) //sys Open(path string, mode int, perm uint32) (fd int, err error) //sys Openat(dirfd int, path string, mode int, perm uint32) (fd int, err error) diff --git a/vendor/golang.org/x/sys/unix/vgetrandom_linux.go b/vendor/golang.org/x/sys/unix/vgetrandom_linux.go new file mode 100644 index 0000000000..07ac8e09d1 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/vgetrandom_linux.go @@ -0,0 +1,13 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux && go1.24 + +package unix + +import _ "unsafe" + +//go:linkname vgetrandom runtime.vgetrandom +//go:noescape +func vgetrandom(p []byte, flags uint32) (ret int, supported bool) diff --git a/vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go b/vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go new file mode 100644 index 0000000000..297e97bce9 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/vgetrandom_unsupported.go @@ -0,0 +1,11 @@ +// Copyright 2024 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !linux || !go1.24 + +package unix + +func vgetrandom(p []byte, flags uint32) (ret int, supported bool) { + return -1, false +} diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go index e40fa85245..d73c4652e6 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go @@ -237,6 +237,9 @@ const ( CLOCK_UPTIME_RAW_APPROX = 0x9 CLONE_NOFOLLOW = 0x1 CLONE_NOOWNERCOPY = 0x2 + CONNECT_DATA_AUTHENTICATED = 0x4 + CONNECT_DATA_IDEMPOTENT = 0x2 + CONNECT_RESUME_ON_READ_WRITE = 0x1 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 @@ -1169,6 +1172,11 @@ const ( PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 + RENAME_EXCL = 0x4 + RENAME_NOFOLLOW_ANY = 0x10 + RENAME_RESERVED1 = 0x8 + RENAME_SECLUDE = 0x1 + RENAME_SWAP = 0x2 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1260,6 +1268,10 @@ const ( RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 + SAE_ASSOCID_ALL = 0xffffffff + SAE_ASSOCID_ANY = 0x0 + SAE_CONNID_ALL = 0xffffffff + SAE_CONNID_ANY = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go index bb02aa6c05..4a55a40058 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go @@ -237,6 +237,9 @@ const ( CLOCK_UPTIME_RAW_APPROX = 0x9 CLONE_NOFOLLOW = 0x1 CLONE_NOOWNERCOPY = 0x2 + CONNECT_DATA_AUTHENTICATED = 0x4 + CONNECT_DATA_IDEMPOTENT = 0x2 + CONNECT_RESUME_ON_READ_WRITE = 0x1 CR0 = 0x0 CR1 = 0x1000 CR2 = 0x2000 @@ -1169,6 +1172,11 @@ const ( PT_WRITE_D = 0x5 PT_WRITE_I = 0x4 PT_WRITE_U = 0x6 + RENAME_EXCL = 0x4 + RENAME_NOFOLLOW_ANY = 0x10 + RENAME_RESERVED1 = 0x8 + RENAME_SECLUDE = 0x1 + RENAME_SWAP = 0x2 RLIMIT_AS = 0x5 RLIMIT_CORE = 0x4 RLIMIT_CPU = 0x0 @@ -1260,6 +1268,10 @@ const ( RTV_SSTHRESH = 0x20 RUSAGE_CHILDREN = -0x1 RUSAGE_SELF = 0x0 + SAE_ASSOCID_ALL = 0xffffffff + SAE_ASSOCID_ANY = 0x0 + SAE_CONNID_ALL = 0xffffffff + SAE_CONNID_ANY = 0x0 SCM_CREDS = 0x3 SCM_RIGHTS = 0x1 SCM_TIMESTAMP = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 877a62b479..de3b462489 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -457,6 +457,7 @@ const ( B600 = 0x8 B75 = 0x2 B9600 = 0xd + BCACHEFS_SUPER_MAGIC = 0xca451a4e BDEVFS_MAGIC = 0x62646576 BINDERFS_SUPER_MAGIC = 0x6c6f6f70 BINFMTFS_MAGIC = 0x42494e4d @@ -494,6 +495,7 @@ const ( BPF_F_TEST_REG_INVARIANTS = 0x80 BPF_F_TEST_RND_HI32 = 0x4 BPF_F_TEST_RUN_ON_CPU = 0x1 + BPF_F_TEST_SKB_CHECKSUM_COMPLETE = 0x4 BPF_F_TEST_STATE_FREQ = 0x8 BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 BPF_F_XDP_DEV_BOUND_ONLY = 0x40 @@ -928,6 +930,7 @@ const ( EPOLL_CTL_ADD = 0x1 EPOLL_CTL_DEL = 0x2 EPOLL_CTL_MOD = 0x3 + EPOLL_IOC_TYPE = 0x8a EROFS_SUPER_MAGIC_V1 = 0xe0f5e1e2 ESP_V4_FLOW = 0xa ESP_V6_FLOW = 0xc @@ -941,9 +944,6 @@ const ( ETHTOOL_FEC_OFF = 0x4 ETHTOOL_FEC_RS = 0x8 ETHTOOL_FLAG_ALL = 0x7 - ETHTOOL_FLAG_COMPACT_BITSETS = 0x1 - ETHTOOL_FLAG_OMIT_REPLY = 0x2 - ETHTOOL_FLAG_STATS = 0x4 ETHTOOL_FLASHDEV = 0x33 ETHTOOL_FLASH_MAX_FILENAME = 0x80 ETHTOOL_FWVERS_LEN = 0x20 @@ -1705,6 +1705,7 @@ const ( KEXEC_ARCH_S390 = 0x160000 KEXEC_ARCH_SH = 0x2a0000 KEXEC_ARCH_X86_64 = 0x3e0000 + KEXEC_CRASH_HOTPLUG_SUPPORT = 0x8 KEXEC_FILE_DEBUG = 0x8 KEXEC_FILE_NO_INITRAMFS = 0x4 KEXEC_FILE_ON_CRASH = 0x2 @@ -1780,6 +1781,7 @@ const ( KEY_SPEC_USER_KEYRING = -0x4 KEY_SPEC_USER_SESSION_KEYRING = -0x5 LANDLOCK_ACCESS_FS_EXECUTE = 0x1 + LANDLOCK_ACCESS_FS_IOCTL_DEV = 0x8000 LANDLOCK_ACCESS_FS_MAKE_BLOCK = 0x800 LANDLOCK_ACCESS_FS_MAKE_CHAR = 0x40 LANDLOCK_ACCESS_FS_MAKE_DIR = 0x80 @@ -1861,6 +1863,19 @@ const ( MAP_FILE = 0x0 MAP_FIXED = 0x10 MAP_FIXED_NOREPLACE = 0x100000 + MAP_HUGE_16GB = 0x88000000 + MAP_HUGE_16KB = 0x38000000 + MAP_HUGE_16MB = 0x60000000 + MAP_HUGE_1GB = 0x78000000 + MAP_HUGE_1MB = 0x50000000 + MAP_HUGE_256MB = 0x70000000 + MAP_HUGE_2GB = 0x7c000000 + MAP_HUGE_2MB = 0x54000000 + MAP_HUGE_32MB = 0x64000000 + MAP_HUGE_512KB = 0x4c000000 + MAP_HUGE_512MB = 0x74000000 + MAP_HUGE_64KB = 0x40000000 + MAP_HUGE_8MB = 0x5c000000 MAP_HUGE_MASK = 0x3f MAP_HUGE_SHIFT = 0x1a MAP_PRIVATE = 0x2 @@ -1908,6 +1923,7 @@ const ( MNT_EXPIRE = 0x4 MNT_FORCE = 0x1 MNT_ID_REQ_SIZE_VER0 = 0x18 + MNT_ID_REQ_SIZE_VER1 = 0x20 MODULE_INIT_COMPRESSED_FILE = 0x4 MODULE_INIT_IGNORE_MODVERSIONS = 0x1 MODULE_INIT_IGNORE_VERMAGIC = 0x2 @@ -2173,7 +2189,7 @@ const ( NFT_REG_SIZE = 0x10 NFT_REJECT_ICMPX_MAX = 0x3 NFT_RT_MAX = 0x4 - NFT_SECMARK_CTX_MAXLEN = 0x100 + NFT_SECMARK_CTX_MAXLEN = 0x1000 NFT_SET_MAXNAMELEN = 0x100 NFT_SOCKET_MAX = 0x3 NFT_TABLE_F_MASK = 0x7 @@ -2342,9 +2358,11 @@ const ( PERF_MEM_LVLNUM_IO = 0xa PERF_MEM_LVLNUM_L1 = 0x1 PERF_MEM_LVLNUM_L2 = 0x2 + PERF_MEM_LVLNUM_L2_MHB = 0x5 PERF_MEM_LVLNUM_L3 = 0x3 PERF_MEM_LVLNUM_L4 = 0x4 PERF_MEM_LVLNUM_LFB = 0xc + PERF_MEM_LVLNUM_MSC = 0x6 PERF_MEM_LVLNUM_NA = 0xf PERF_MEM_LVLNUM_PMEM = 0xe PERF_MEM_LVLNUM_RAM = 0xd @@ -2417,6 +2435,7 @@ const ( PRIO_PGRP = 0x1 PRIO_PROCESS = 0x0 PRIO_USER = 0x2 + PROCFS_IOCTL_MAGIC = 'f' PROC_SUPER_MAGIC = 0x9fa0 PROT_EXEC = 0x4 PROT_GROWSDOWN = 0x1000000 @@ -2498,6 +2517,23 @@ const ( PR_PAC_GET_ENABLED_KEYS = 0x3d PR_PAC_RESET_KEYS = 0x36 PR_PAC_SET_ENABLED_KEYS = 0x3c + PR_PPC_DEXCR_CTRL_CLEAR = 0x4 + PR_PPC_DEXCR_CTRL_CLEAR_ONEXEC = 0x10 + PR_PPC_DEXCR_CTRL_EDITABLE = 0x1 + PR_PPC_DEXCR_CTRL_MASK = 0x1f + PR_PPC_DEXCR_CTRL_SET = 0x2 + PR_PPC_DEXCR_CTRL_SET_ONEXEC = 0x8 + PR_PPC_DEXCR_IBRTPD = 0x1 + PR_PPC_DEXCR_NPHIE = 0x3 + PR_PPC_DEXCR_SBHE = 0x0 + PR_PPC_DEXCR_SRAPD = 0x2 + PR_PPC_GET_DEXCR = 0x48 + PR_PPC_SET_DEXCR = 0x49 + PR_RISCV_CTX_SW_FENCEI_OFF = 0x1 + PR_RISCV_CTX_SW_FENCEI_ON = 0x0 + PR_RISCV_SCOPE_PER_PROCESS = 0x0 + PR_RISCV_SCOPE_PER_THREAD = 0x1 + PR_RISCV_SET_ICACHE_FLUSH_CTX = 0x47 PR_RISCV_V_GET_CONTROL = 0x46 PR_RISCV_V_SET_CONTROL = 0x45 PR_RISCV_V_VSTATE_CTRL_CUR_MASK = 0x3 @@ -2902,11 +2938,12 @@ const ( RUSAGE_SELF = 0x0 RUSAGE_THREAD = 0x1 RWF_APPEND = 0x10 + RWF_ATOMIC = 0x40 RWF_DSYNC = 0x2 RWF_HIPRI = 0x1 RWF_NOAPPEND = 0x20 RWF_NOWAIT = 0x8 - RWF_SUPPORTED = 0x3f + RWF_SUPPORTED = 0x7f RWF_SYNC = 0x4 RWF_WRITE_LIFE_NOT_SET = 0x0 SCHED_BATCH = 0x3 @@ -3179,6 +3216,7 @@ const ( STATX_ATTR_MOUNT_ROOT = 0x2000 STATX_ATTR_NODUMP = 0x40 STATX_ATTR_VERITY = 0x100000 + STATX_ATTR_WRITE_ATOMIC = 0x400000 STATX_BASIC_STATS = 0x7ff STATX_BLOCKS = 0x400 STATX_BTIME = 0x800 @@ -3192,8 +3230,10 @@ const ( STATX_MTIME = 0x40 STATX_NLINK = 0x4 STATX_SIZE = 0x200 + STATX_SUBVOL = 0x8000 STATX_TYPE = 0x1 STATX_UID = 0x8 + STATX_WRITE_ATOMIC = 0x10000 STATX__RESERVED = 0x80000000 SYNC_FILE_RANGE_WAIT_AFTER = 0x4 SYNC_FILE_RANGE_WAIT_BEFORE = 0x1 @@ -3592,6 +3632,7 @@ const ( XDP_UMEM_PGOFF_COMPLETION_RING = 0x180000000 XDP_UMEM_PGOFF_FILL_RING = 0x100000000 XDP_UMEM_REG = 0x4 + XDP_UMEM_TX_METADATA_LEN = 0x4 XDP_UMEM_TX_SW_CSUM = 0x2 XDP_UMEM_UNALIGNED_CHUNK_FLAG = 0x1 XDP_USE_NEED_WAKEUP = 0x8 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index e4bc0bd57c..8aa6d77c01 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -151,9 +153,14 @@ const ( NFDBITS = 0x20 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 689317afdb..da428f4253 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -151,9 +153,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index 5cca668ac3..bf45bfec78 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x20 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 14270508b0..71c67162b7 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 ESR_MAGIC = 0x45535201 EXTPROC = 0x10000 @@ -152,9 +154,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index 28e39afdcb..9476628fa0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -152,9 +154,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index cd66e92cb4..b9e85f3cf0 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x20 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index c1595eba78..a48b68a764 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index ee9456b0da..ea00e8522a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index 8cfca81e1b..91c6468717 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x80 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x20 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index 60b0deb3af..8cbf38d639 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x20 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000000 FF1 = 0x4000 @@ -150,9 +152,14 @@ const ( NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index f90aa7281b..a2df734191 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x20 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000000 FF1 = 0x4000 @@ -150,9 +152,14 @@ const ( NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index ba9e015033..2479137923 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x20 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000000 FF1 = 0x4000 @@ -150,9 +152,14 @@ const ( NL3 = 0x300 NLDLY = 0x300 NOFLSH = 0x80000000 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x4 ONLCR = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index 07cdfd6e9f..d265f146ee 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 2f1dd214a7..3f2d644396 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -78,6 +78,8 @@ const ( ECHOPRT = 0x400 EFD_CLOEXEC = 0x80000 EFD_NONBLOCK = 0x800 + EPIOCGPARAMS = 0x80088a02 + EPIOCSPARAMS = 0x40088a01 EPOLL_CLOEXEC = 0x80000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -148,9 +150,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x8008b705 NS_GET_NSTYPE = 0xb703 NS_GET_OWNER_UID = 0xb704 NS_GET_PARENT = 0xb702 + NS_GET_PID_FROM_PIDNS = 0x8004b706 + NS_GET_PID_IN_PIDNS = 0x8004b708 + NS_GET_TGID_FROM_PIDNS = 0x8004b707 + NS_GET_TGID_IN_PIDNS = 0x8004b709 NS_GET_USERNS = 0xb701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index f40519d901..5d8b727a1c 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -82,6 +82,8 @@ const ( EFD_CLOEXEC = 0x400000 EFD_NONBLOCK = 0x4000 EMT_TAGOVF = 0x1 + EPIOCGPARAMS = 0x40088a02 + EPIOCSPARAMS = 0x80088a01 EPOLL_CLOEXEC = 0x400000 EXTPROC = 0x10000 FF1 = 0x8000 @@ -153,9 +155,14 @@ const ( NFDBITS = 0x40 NLDLY = 0x100 NOFLSH = 0x80 + NS_GET_MNTNS_ID = 0x4008b705 NS_GET_NSTYPE = 0x2000b703 NS_GET_OWNER_UID = 0x2000b704 NS_GET_PARENT = 0x2000b702 + NS_GET_PID_FROM_PIDNS = 0x4004b706 + NS_GET_PID_IN_PIDNS = 0x4004b708 + NS_GET_TGID_FROM_PIDNS = 0x4004b707 + NS_GET_TGID_IN_PIDNS = 0x4004b709 NS_GET_USERNS = 0x2000b701 OLCUC = 0x2 ONLCR = 0x4 diff --git a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go index da08b2ab3d..1ec2b1407b 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_zos_s390x.go @@ -581,6 +581,8 @@ const ( AT_EMPTY_PATH = 0x1000 AT_REMOVEDIR = 0x200 RENAME_NOREPLACE = 1 << 0 + ST_RDONLY = 1 + ST_NOSUID = 2 ) const ( diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go index 07642c308d..24b346e1a3 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go @@ -740,6 +740,54 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func renamexNp(from string, to string, flag uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := syscall_syscall(libc_renamex_np_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_renamex_np_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renamex_np renamex_np "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func renameatxNp(fromfd int, from string, tofd int, to string, flag uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_renameatx_np_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), uintptr(flag), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_renameatx_np_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameatx_np renameatx_np "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { @@ -793,6 +841,26 @@ var libc_pthread_fchdir_np_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error) { + var _p0 unsafe.Pointer + if len(iov) > 0 { + _p0 = unsafe.Pointer(&iov[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall9(libc_connectx_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(endpoints)), uintptr(associd), uintptr(flags), uintptr(_p0), uintptr(len(iov)), uintptr(unsafe.Pointer(n)), uintptr(unsafe.Pointer(connid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_connectx_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connectx connectx "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s index 923e08cb79..ebd213100b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s @@ -223,6 +223,16 @@ TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) +TEXT libc_renamex_np_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renamex_np(SB) +GLOBL ·libc_renamex_np_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renamex_np_trampoline_addr(SB)/8, $libc_renamex_np_trampoline<>(SB) + +TEXT libc_renameatx_np_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameatx_np(SB) +GLOBL ·libc_renameatx_np_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameatx_np_trampoline_addr(SB)/8, $libc_renameatx_np_trampoline<>(SB) + TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 @@ -238,6 +248,11 @@ TEXT libc_pthread_fchdir_np_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8 DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB) +TEXT libc_connectx_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connectx(SB) +GLOBL ·libc_connectx_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connectx_trampoline_addr(SB)/8, $libc_connectx_trampoline<>(SB) + TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go index 7d73dda647..824b9c2d5e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go @@ -740,6 +740,54 @@ func ioctlPtr(fd int, req uint, arg unsafe.Pointer) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func renamexNp(from string, to string, flag uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := syscall_syscall(libc_renamex_np_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flag)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_renamex_np_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renamex_np renamex_np "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func renameatxNp(fromfd int, from string, tofd int, to string, flag uint32) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(from) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(to) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_renameatx_np_trampoline_addr, uintptr(fromfd), uintptr(unsafe.Pointer(_p0)), uintptr(tofd), uintptr(unsafe.Pointer(_p1)), uintptr(flag), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_renameatx_np_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_renameatx_np renameatx_np "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) { var _p0 unsafe.Pointer if len(mib) > 0 { @@ -793,6 +841,26 @@ var libc_pthread_fchdir_np_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func connectx(fd int, endpoints *SaEndpoints, associd SaeAssocID, flags uint32, iov []Iovec, n *uintptr, connid *SaeConnID) (err error) { + var _p0 unsafe.Pointer + if len(iov) > 0 { + _p0 = unsafe.Pointer(&iov[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := syscall_syscall9(libc_connectx_trampoline_addr, uintptr(fd), uintptr(unsafe.Pointer(endpoints)), uintptr(associd), uintptr(flags), uintptr(_p0), uintptr(len(iov)), uintptr(unsafe.Pointer(n)), uintptr(unsafe.Pointer(connid)), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_connectx_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_connectx connectx "/usr/lib/libSystem.B.dylib" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) { _, _, e1 := syscall_syscall6(libc_sendfile_trampoline_addr, uintptr(infd), uintptr(outfd), uintptr(offset), uintptr(unsafe.Pointer(len)), uintptr(hdtr), uintptr(flags)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s index 057700111e..4f178a2293 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s @@ -223,6 +223,16 @@ TEXT libc_ioctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_ioctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_ioctl_trampoline_addr(SB)/8, $libc_ioctl_trampoline<>(SB) +TEXT libc_renamex_np_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renamex_np(SB) +GLOBL ·libc_renamex_np_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renamex_np_trampoline_addr(SB)/8, $libc_renamex_np_trampoline<>(SB) + +TEXT libc_renameatx_np_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_renameatx_np(SB) +GLOBL ·libc_renameatx_np_trampoline_addr(SB), RODATA, $8 +DATA ·libc_renameatx_np_trampoline_addr(SB)/8, $libc_renameatx_np_trampoline<>(SB) + TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sysctl(SB) GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 @@ -238,6 +248,11 @@ TEXT libc_pthread_fchdir_np_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_pthread_fchdir_np_trampoline_addr(SB), RODATA, $8 DATA ·libc_pthread_fchdir_np_trampoline_addr(SB)/8, $libc_pthread_fchdir_np_trampoline<>(SB) +TEXT libc_connectx_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_connectx(SB) +GLOBL ·libc_connectx_trampoline_addr(SB), RODATA, $8 +DATA ·libc_connectx_trampoline_addr(SB)/8, $libc_connectx_trampoline<>(SB) + TEXT libc_sendfile_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_sendfile(SB) GLOBL ·libc_sendfile_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 87d8612a1d..af30da5578 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -971,23 +971,6 @@ func Getpriority(which int, who int) (prio int, err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Getrandom(buf []byte, flags int) (n int, err error) { - var _p0 unsafe.Pointer - if len(buf) > 0 { - _p0 = unsafe.Pointer(&buf[0]) - } else { - _p0 = unsafe.Pointer(&_zero) - } - r0, _, e1 := Syscall(SYS_GETRANDOM, uintptr(_p0), uintptr(len(buf)), uintptr(flags)) - n = int(r0) - if e1 != 0 { - err = errnoErr(e1) - } - return -} - -// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT - func Getrusage(who int, rusage *Rusage) (err error) { _, _, e1 := RawSyscall(SYS_GETRUSAGE, uintptr(who), uintptr(unsafe.Pointer(rusage)), 0) if e1 != 0 { @@ -2229,3 +2212,19 @@ func Cachestat(fd uint, crange *CachestatRange, cstat *Cachestat_t, flags uint) } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func Mseal(b []byte, flags uint) (err error) { + var _p0 unsafe.Pointer + if len(b) > 0 { + _p0 = unsafe.Pointer(&b[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall(SYS_MSEAL, uintptr(_p0), uintptr(len(b)), uintptr(flags)) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 9dc42410b7..1851df14e8 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 41b5617316..0b43c69365 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $4 DATA ·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mount_trampoline_addr(SB)/4, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index 0d3a0751cd..e1ec0dbe4e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 4019a656f6..880c6d6e31 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index c39f7776db..7c8452a63e 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index ac4af24f90..b8ef95b0fa 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $4 DATA ·libc_mknodat_trampoline_addr(SB)/4, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $4 +DATA ·libc_mount_trampoline_addr(SB)/4, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 57571d072f..2ffdf861f7 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index f77d532121..2af3b5c762 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index e62963e67e..1da08d5267 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index fae140b62c..b7a251353b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index 00831354c8..6e85b0aac9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 9d1e0ff06d..f15dadf055 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -555,6 +555,12 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_mount(SB) + RET +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_nanosleep(SB) RET diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index 79029ed584..28b487df25 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -1493,6 +1493,30 @@ var libc_mknodat_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func Mount(fsType string, dir string, flags int, data unsafe.Pointer) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(fsType) + if err != nil { + return + } + var _p1 *byte + _p1, err = BytePtrFromString(dir) + if err != nil { + return + } + _, _, e1 := syscall_syscall6(libc_mount_trampoline_addr, uintptr(unsafe.Pointer(_p0)), uintptr(unsafe.Pointer(_p1)), uintptr(flags), uintptr(data), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_mount_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_mount mount "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Nanosleep(time *Timespec, leftover *Timespec) (err error) { _, _, e1 := syscall_syscall(libc_nanosleep_trampoline_addr, uintptr(unsafe.Pointer(time)), uintptr(unsafe.Pointer(leftover)), 0) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index da115f9a4b..1e7f321e43 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -463,6 +463,11 @@ TEXT libc_mknodat_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_mknodat_trampoline_addr(SB), RODATA, $8 DATA ·libc_mknodat_trampoline_addr(SB)/8, $libc_mknodat_trampoline<>(SB) +TEXT libc_mount_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_mount(SB) +GLOBL ·libc_mount_trampoline_addr(SB), RODATA, $8 +DATA ·libc_mount_trampoline_addr(SB)/8, $libc_mount_trampoline<>(SB) + TEXT libc_nanosleep_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_nanosleep(SB) GLOBL ·libc_nanosleep_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go index 53aef5dc58..524b0820cb 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_386.go @@ -457,4 +457,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go index 71d524763d..f485dbf456 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go @@ -341,6 +341,7 @@ const ( SYS_STATX = 332 SYS_IO_PGETEVENTS = 333 SYS_RSEQ = 334 + SYS_URETPROBE = 335 SYS_PIDFD_SEND_SIGNAL = 424 SYS_IO_URING_SETUP = 425 SYS_IO_URING_ENTER = 426 @@ -379,4 +380,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go index c747706131..70b35bf3b0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go @@ -421,4 +421,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go index f96e214f6d..1893e2fe88 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go @@ -85,7 +85,7 @@ const ( SYS_SPLICE = 76 SYS_TEE = 77 SYS_READLINKAT = 78 - SYS_FSTATAT = 79 + SYS_NEWFSTATAT = 79 SYS_FSTAT = 80 SYS_SYNC = 81 SYS_FSYNC = 82 @@ -324,4 +324,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go index 28425346cf..16a4017da0 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_loong64.go @@ -84,6 +84,8 @@ const ( SYS_SPLICE = 76 SYS_TEE = 77 SYS_READLINKAT = 78 + SYS_NEWFSTATAT = 79 + SYS_FSTAT = 80 SYS_SYNC = 81 SYS_FSYNC = 82 SYS_FDATASYNC = 83 @@ -318,4 +320,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go index d0953018da..7e567f1eff 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go @@ -441,4 +441,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 4459 SYS_LSM_SET_SELF_ATTR = 4460 SYS_LSM_LIST_MODULES = 4461 + SYS_MSEAL = 4462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go index 295c7f4b81..38ae55e5ef 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go @@ -371,4 +371,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 5459 SYS_LSM_SET_SELF_ATTR = 5460 SYS_LSM_LIST_MODULES = 5461 + SYS_MSEAL = 5462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go index d1a9eaca7a..55e92e60a8 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go @@ -371,4 +371,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 5459 SYS_LSM_SET_SELF_ATTR = 5460 SYS_LSM_LIST_MODULES = 5461 + SYS_MSEAL = 5462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go index bec157c39f..60658d6a02 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go @@ -441,4 +441,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 4459 SYS_LSM_SET_SELF_ATTR = 4460 SYS_LSM_LIST_MODULES = 4461 + SYS_MSEAL = 4462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go index 7ee7bdc435..e203e8a7ed 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc.go @@ -448,4 +448,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go index fad1f25b44..5944b97d54 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go @@ -420,4 +420,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go index 7d3e16357d..c66d416dad 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go @@ -420,4 +420,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 0ed53ad9f7..a5459e766f 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -84,7 +84,7 @@ const ( SYS_SPLICE = 76 SYS_TEE = 77 SYS_READLINKAT = 78 - SYS_FSTATAT = 79 + SYS_NEWFSTATAT = 79 SYS_FSTAT = 80 SYS_SYNC = 81 SYS_FSYNC = 82 @@ -325,4 +325,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 2fba04ad50..01d86825bb 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -386,4 +386,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go index 621d00d741..7b703e77cd 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go @@ -399,4 +399,5 @@ const ( SYS_LSM_GET_SELF_ATTR = 459 SYS_LSM_SET_SELF_ATTR = 460 SYS_LSM_LIST_MODULES = 461 + SYS_MSEAL = 462 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go index 091d107f3a..d003c3d437 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go @@ -306,6 +306,19 @@ type XVSockPgen struct { type _Socklen uint32 +type SaeAssocID uint32 + +type SaeConnID uint32 + +type SaEndpoints struct { + Srcif uint32 + Srcaddr *RawSockaddr + Srcaddrlen uint32 + Dstaddr *RawSockaddr + Dstaddrlen uint32 + _ [4]byte +} + type Xucred struct { Version uint32 Uid uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go index 28ff4ef74d..0d45a941aa 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go @@ -306,6 +306,19 @@ type XVSockPgen struct { type _Socklen uint32 +type SaeAssocID uint32 + +type SaeConnID uint32 + +type SaEndpoints struct { + Srcif uint32 + Srcaddr *RawSockaddr + Srcaddrlen uint32 + Dstaddr *RawSockaddr + Dstaddrlen uint32 + _ [4]byte +} + type Xucred struct { Version uint32 Uid uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go index 6cbd094a3a..51e13eb055 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go @@ -625,6 +625,7 @@ const ( POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 + POLLRDHUP = 0x4000 ) type CapRights struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go index 7c03b6ee77..d002d8ef3c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go @@ -630,6 +630,7 @@ const ( POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 + POLLRDHUP = 0x4000 ) type CapRights struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go index 422107ee8b..3f863d898d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go @@ -616,6 +616,7 @@ const ( POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 + POLLRDHUP = 0x4000 ) type CapRights struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go index 505a12acfd..61c7293106 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go @@ -610,6 +610,7 @@ const ( POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 + POLLRDHUP = 0x4000 ) type CapRights struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go index cc986c7900..b5d17414f0 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_freebsd_riscv64.go @@ -612,6 +612,7 @@ const ( POLLRDNORM = 0x40 POLLWRBAND = 0x100 POLLWRNORM = 0x4 + POLLRDHUP = 0x4000 ) type CapRights struct { diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 4740b83485..3a69e45496 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -87,30 +87,35 @@ type StatxTimestamp struct { } type Statx_t struct { - Mask uint32 - Blksize uint32 - Attributes uint64 - Nlink uint32 - Uid uint32 - Gid uint32 - Mode uint16 - _ [1]uint16 - Ino uint64 - Size uint64 - Blocks uint64 - Attributes_mask uint64 - Atime StatxTimestamp - Btime StatxTimestamp - Ctime StatxTimestamp - Mtime StatxTimestamp - Rdev_major uint32 - Rdev_minor uint32 - Dev_major uint32 - Dev_minor uint32 - Mnt_id uint64 - Dio_mem_align uint32 - Dio_offset_align uint32 - _ [12]uint64 + Mask uint32 + Blksize uint32 + Attributes uint64 + Nlink uint32 + Uid uint32 + Gid uint32 + Mode uint16 + _ [1]uint16 + Ino uint64 + Size uint64 + Blocks uint64 + Attributes_mask uint64 + Atime StatxTimestamp + Btime StatxTimestamp + Ctime StatxTimestamp + Mtime StatxTimestamp + Rdev_major uint32 + Rdev_minor uint32 + Dev_major uint32 + Dev_minor uint32 + Mnt_id uint64 + Dio_mem_align uint32 + Dio_offset_align uint32 + Subvol uint64 + Atomic_write_unit_min uint32 + Atomic_write_unit_max uint32 + Atomic_write_segments_max uint32 + _ [1]uint32 + _ [9]uint64 } type Fsid struct { @@ -515,6 +520,29 @@ type TCPInfo struct { Total_rto_time uint32 } +type TCPVegasInfo struct { + Enabled uint32 + Rttcnt uint32 + Rtt uint32 + Minrtt uint32 +} + +type TCPDCTCPInfo struct { + Enabled uint16 + Ce_state uint16 + Alpha uint32 + Ab_ecn uint32 + Ab_tot uint32 +} + +type TCPBBRInfo struct { + Bw_lo uint32 + Bw_hi uint32 + Min_rtt uint32 + Pacing_gain uint32 + Cwnd_gain uint32 +} + type CanFilter struct { Id uint32 Mask uint32 @@ -556,6 +584,7 @@ const ( SizeofICMPv6Filter = 0x20 SizeofUcred = 0xc SizeofTCPInfo = 0xf8 + SizeofTCPCCInfo = 0x14 SizeofCanFilter = 0x8 SizeofTCPRepairOpt = 0x8 ) @@ -2485,7 +2514,7 @@ type XDPMmapOffsets struct { type XDPUmemReg struct { Addr uint64 Len uint64 - Chunk_size uint32 + Size uint32 Headroom uint32 Flags uint32 Tx_metadata_len uint32 @@ -3473,7 +3502,7 @@ const ( DEVLINK_PORT_FN_ATTR_STATE = 0x2 DEVLINK_PORT_FN_ATTR_OPSTATE = 0x3 DEVLINK_PORT_FN_ATTR_CAPS = 0x4 - DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x5 + DEVLINK_PORT_FUNCTION_ATTR_MAX = 0x6 ) type FsverityDigest struct { @@ -3765,7 +3794,7 @@ const ( ETHTOOL_MSG_PSE_GET = 0x24 ETHTOOL_MSG_PSE_SET = 0x25 ETHTOOL_MSG_RSS_GET = 0x26 - ETHTOOL_MSG_USER_MAX = 0x2b + ETHTOOL_MSG_USER_MAX = 0x2c ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3805,7 +3834,10 @@ const ( ETHTOOL_MSG_MODULE_NTF = 0x24 ETHTOOL_MSG_PSE_GET_REPLY = 0x25 ETHTOOL_MSG_RSS_GET_REPLY = 0x26 - ETHTOOL_MSG_KERNEL_MAX = 0x2b + ETHTOOL_MSG_KERNEL_MAX = 0x2c + ETHTOOL_FLAG_COMPACT_BITSETS = 0x1 + ETHTOOL_FLAG_OMIT_REPLY = 0x2 + ETHTOOL_FLAG_STATS = 0x4 ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3947,7 +3979,7 @@ const ( ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 - ETHTOOL_A_COALESCE_MAX = 0x1c + ETHTOOL_A_COALESCE_MAX = 0x1e ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 @@ -3975,7 +4007,7 @@ const ( ETHTOOL_A_TSINFO_TX_TYPES = 0x3 ETHTOOL_A_TSINFO_RX_FILTERS = 0x4 ETHTOOL_A_TSINFO_PHC_INDEX = 0x5 - ETHTOOL_A_TSINFO_MAX = 0x5 + ETHTOOL_A_TSINFO_MAX = 0x6 ETHTOOL_A_CABLE_TEST_UNSPEC = 0x0 ETHTOOL_A_CABLE_TEST_HEADER = 0x1 ETHTOOL_A_CABLE_TEST_MAX = 0x1 @@ -4605,7 +4637,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x14a + NL80211_ATTR_MAX = 0x14c NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -5209,7 +5241,7 @@ const ( NL80211_FREQUENCY_ATTR_GO_CONCURRENT = 0xf NL80211_FREQUENCY_ATTR_INDOOR_ONLY = 0xe NL80211_FREQUENCY_ATTR_IR_CONCURRENT = 0xf - NL80211_FREQUENCY_ATTR_MAX = 0x20 + NL80211_FREQUENCY_ATTR_MAX = 0x21 NL80211_FREQUENCY_ATTR_MAX_TX_POWER = 0x6 NL80211_FREQUENCY_ATTR_NO_10MHZ = 0x11 NL80211_FREQUENCY_ATTR_NO_160MHZ = 0xc diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index 15adc04142..ad05b51a60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -727,6 +727,37 @@ const ( RISCV_HWPROBE_EXT_ZBA = 0x8 RISCV_HWPROBE_EXT_ZBB = 0x10 RISCV_HWPROBE_EXT_ZBS = 0x20 + RISCV_HWPROBE_EXT_ZICBOZ = 0x40 + RISCV_HWPROBE_EXT_ZBC = 0x80 + RISCV_HWPROBE_EXT_ZBKB = 0x100 + RISCV_HWPROBE_EXT_ZBKC = 0x200 + RISCV_HWPROBE_EXT_ZBKX = 0x400 + RISCV_HWPROBE_EXT_ZKND = 0x800 + RISCV_HWPROBE_EXT_ZKNE = 0x1000 + RISCV_HWPROBE_EXT_ZKNH = 0x2000 + RISCV_HWPROBE_EXT_ZKSED = 0x4000 + RISCV_HWPROBE_EXT_ZKSH = 0x8000 + RISCV_HWPROBE_EXT_ZKT = 0x10000 + RISCV_HWPROBE_EXT_ZVBB = 0x20000 + RISCV_HWPROBE_EXT_ZVBC = 0x40000 + RISCV_HWPROBE_EXT_ZVKB = 0x80000 + RISCV_HWPROBE_EXT_ZVKG = 0x100000 + RISCV_HWPROBE_EXT_ZVKNED = 0x200000 + RISCV_HWPROBE_EXT_ZVKNHA = 0x400000 + RISCV_HWPROBE_EXT_ZVKNHB = 0x800000 + RISCV_HWPROBE_EXT_ZVKSED = 0x1000000 + RISCV_HWPROBE_EXT_ZVKSH = 0x2000000 + RISCV_HWPROBE_EXT_ZVKT = 0x4000000 + RISCV_HWPROBE_EXT_ZFH = 0x8000000 + RISCV_HWPROBE_EXT_ZFHMIN = 0x10000000 + RISCV_HWPROBE_EXT_ZIHINTNTL = 0x20000000 + RISCV_HWPROBE_EXT_ZVFH = 0x40000000 + RISCV_HWPROBE_EXT_ZVFHMIN = 0x80000000 + RISCV_HWPROBE_EXT_ZFA = 0x100000000 + RISCV_HWPROBE_EXT_ZTSO = 0x200000000 + RISCV_HWPROBE_EXT_ZACAS = 0x400000000 + RISCV_HWPROBE_EXT_ZICOND = 0x800000000 + RISCV_HWPROBE_EXT_ZIHINTPAUSE = 0x1000000000 RISCV_HWPROBE_KEY_CPUPERF_0 = 0x5 RISCV_HWPROBE_MISALIGNED_UNKNOWN = 0x0 RISCV_HWPROBE_MISALIGNED_EMULATED = 0x1 @@ -734,4 +765,6 @@ const ( RISCV_HWPROBE_MISALIGNED_FAST = 0x3 RISCV_HWPROBE_MISALIGNED_UNSUPPORTED = 0x4 RISCV_HWPROBE_MISALIGNED_MASK = 0x7 + RISCV_HWPROBE_KEY_ZICBOZ_BLOCK_SIZE = 0x6 + RISCV_HWPROBE_WHICH_CPUS = 0x1 ) diff --git a/vendor/golang.org/x/sys/windows/dll_windows.go b/vendor/golang.org/x/sys/windows/dll_windows.go index 115341fba6..4e613cf633 100644 --- a/vendor/golang.org/x/sys/windows/dll_windows.go +++ b/vendor/golang.org/x/sys/windows/dll_windows.go @@ -65,7 +65,7 @@ func LoadDLL(name string) (dll *DLL, err error) { return d, nil } -// MustLoadDLL is like LoadDLL but panics if load operation failes. +// MustLoadDLL is like LoadDLL but panics if load operation fails. func MustLoadDLL(name string) *DLL { d, e := LoadDLL(name) if e != nil { diff --git a/vendor/golang.org/x/sys/windows/security_windows.go b/vendor/golang.org/x/sys/windows/security_windows.go index 97651b5bd0..b6e1ab76f8 100644 --- a/vendor/golang.org/x/sys/windows/security_windows.go +++ b/vendor/golang.org/x/sys/windows/security_windows.go @@ -1179,7 +1179,7 @@ type OBJECTS_AND_NAME struct { //sys makeSelfRelativeSD(absoluteSD *SECURITY_DESCRIPTOR, selfRelativeSD *SECURITY_DESCRIPTOR, selfRelativeSDSize *uint32) (err error) = advapi32.MakeSelfRelativeSD //sys setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCESS, oldACL *ACL, newACL **ACL) (ret error) = advapi32.SetEntriesInAclW -//sys GetAce(acl *ACL, aceIndex uint32, pAce **ACCESS_ALLOWED_ACE) (ret error) = advapi32.GetAce +//sys GetAce(acl *ACL, aceIndex uint32, pAce **ACCESS_ALLOWED_ACE) (err error) = advapi32.GetAce // Control returns the security descriptor control bits. func (sd *SECURITY_DESCRIPTOR) Control() (control SECURITY_DESCRIPTOR_CONTROL, revision uint32, err error) { diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/config.go b/vendor/golang.org/x/sys/windows/svc/mgr/config.go index a6d3e8a88a..3c7ba08f58 100644 --- a/vendor/golang.org/x/sys/windows/svc/mgr/config.go +++ b/vendor/golang.org/x/sys/windows/svc/mgr/config.go @@ -63,7 +63,7 @@ func toStringSlice(ps *uint16) []string { return r } -// Config retrieves service s configuration paramteres. +// Config retrieves service s configuration parameters. func (s *Service) Config() (Config, error) { var p *windows.QUERY_SERVICE_CONFIG n := uint32(1024) diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go index cdf880e13a..ef2a687840 100644 --- a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go +++ b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go @@ -137,7 +137,7 @@ func (s *Service) RecoveryCommand() (string, error) { // SetRecoveryActionsOnNonCrashFailures sets the failure actions flag. If the // flag is set to false, recovery actions will only be performed if the service // terminates without reporting a status of SERVICE_STOPPED. If the flag is set -// to true, recovery actions are also perfomed if the service stops with a +// to true, recovery actions are also performed if the service stops with a // nonzero exit code. func (s *Service) SetRecoveryActionsOnNonCrashFailures(flag bool) error { var setting windows.SERVICE_FAILURE_ACTIONS_FLAG @@ -151,7 +151,7 @@ func (s *Service) SetRecoveryActionsOnNonCrashFailures(flag bool) error { // actions flag. If the flag is set to false, recovery actions will only be // performed if the service terminates without reporting a status of // SERVICE_STOPPED. If the flag is set to true, recovery actions are also -// perfomed if the service stops with a nonzero exit code. +// performed if the service stops with a nonzero exit code. func (s *Service) RecoveryActionsOnNonCrashFailures() (bool, error) { b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS_FLAG) if err != nil { diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 6525c62f3c..5cee9a3143 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -17,8 +17,10 @@ import ( "unsafe" ) -type Handle uintptr -type HWND uintptr +type ( + Handle uintptr + HWND uintptr +) const ( InvalidHandle = ^Handle(0) @@ -211,6 +213,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) (handle Handle, err error) //sys ShellExecute(hwnd Handle, verb *uint16, file *uint16, args *uint16, cwd *uint16, showCmd int32) (err error) [failretval<=32] = shell32.ShellExecuteW //sys GetWindowThreadProcessId(hwnd HWND, pid *uint32) (tid uint32, err error) = user32.GetWindowThreadProcessId +//sys LoadKeyboardLayout(name *uint16, flags uint32) (hkl Handle, err error) [failretval==0] = user32.LoadKeyboardLayoutW +//sys UnloadKeyboardLayout(hkl Handle) (err error) = user32.UnloadKeyboardLayout +//sys GetKeyboardLayout(tid uint32) (hkl Handle) = user32.GetKeyboardLayout +//sys ToUnicodeEx(vkey uint32, scancode uint32, keystate *byte, pwszBuff *uint16, cchBuff int32, flags uint32, hkl Handle) (ret int32) = user32.ToUnicodeEx //sys GetShellWindow() (shellWindow HWND) = user32.GetShellWindow //sys MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) [failretval==0] = user32.MessageBoxW //sys ExitWindowsEx(flags uint32, reason uint32) (err error) = user32.ExitWindowsEx @@ -307,6 +313,10 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys SetConsoleMode(console Handle, mode uint32) (err error) = kernel32.SetConsoleMode //sys GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) = kernel32.GetConsoleScreenBufferInfo //sys setConsoleCursorPosition(console Handle, position uint32) (err error) = kernel32.SetConsoleCursorPosition +//sys GetConsoleCP() (cp uint32, err error) = kernel32.GetConsoleCP +//sys GetConsoleOutputCP() (cp uint32, err error) = kernel32.GetConsoleOutputCP +//sys SetConsoleCP(cp uint32) (err error) = kernel32.SetConsoleCP +//sys SetConsoleOutputCP(cp uint32) (err error) = kernel32.SetConsoleOutputCP //sys WriteConsole(console Handle, buf *uint16, towrite uint32, written *uint32, reserved *byte) (err error) = kernel32.WriteConsoleW //sys ReadConsole(console Handle, buf *uint16, toread uint32, read *uint32, inputControl *byte) (err error) = kernel32.ReadConsoleW //sys resizePseudoConsole(pconsole Handle, size uint32) (hr error) = kernel32.ResizePseudoConsole @@ -1368,9 +1378,11 @@ func SetsockoptLinger(fd Handle, level, opt int, l *Linger) (err error) { func SetsockoptInet4Addr(fd Handle, level, opt int, value [4]byte) (err error) { return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(&value[0])), 4) } + func SetsockoptIPMreq(fd Handle, level, opt int, mreq *IPMreq) (err error) { return Setsockopt(fd, int32(level), int32(opt), (*byte)(unsafe.Pointer(mreq)), int32(unsafe.Sizeof(*mreq))) } + func SetsockoptIPv6Mreq(fd Handle, level, opt int, mreq *IPv6Mreq) (err error) { return syscall.EWINDOWS } diff --git a/vendor/golang.org/x/sys/windows/types_windows.go b/vendor/golang.org/x/sys/windows/types_windows.go index d8cb71db0a..7b97a154c9 100644 --- a/vendor/golang.org/x/sys/windows/types_windows.go +++ b/vendor/golang.org/x/sys/windows/types_windows.go @@ -1060,6 +1060,7 @@ const ( SIO_GET_EXTENSION_FUNCTION_POINTER = IOC_INOUT | IOC_WS2 | 6 SIO_KEEPALIVE_VALS = IOC_IN | IOC_VENDOR | 4 SIO_UDP_CONNRESET = IOC_IN | IOC_VENDOR | 12 + SIO_UDP_NETRESET = IOC_IN | IOC_VENDOR | 15 // cf. http://support.microsoft.com/default.aspx?scid=kb;en-us;257460 @@ -2003,7 +2004,21 @@ const ( MOVEFILE_FAIL_IF_NOT_TRACKABLE = 0x20 ) -const GAA_FLAG_INCLUDE_PREFIX = 0x00000010 +// Flags for GetAdaptersAddresses, see +// https://learn.microsoft.com/en-us/windows/win32/api/iphlpapi/nf-iphlpapi-getadaptersaddresses. +const ( + GAA_FLAG_SKIP_UNICAST = 0x1 + GAA_FLAG_SKIP_ANYCAST = 0x2 + GAA_FLAG_SKIP_MULTICAST = 0x4 + GAA_FLAG_SKIP_DNS_SERVER = 0x8 + GAA_FLAG_INCLUDE_PREFIX = 0x10 + GAA_FLAG_SKIP_FRIENDLY_NAME = 0x20 + GAA_FLAG_INCLUDE_WINS_INFO = 0x40 + GAA_FLAG_INCLUDE_GATEWAYS = 0x80 + GAA_FLAG_INCLUDE_ALL_INTERFACES = 0x100 + GAA_FLAG_INCLUDE_ALL_COMPARTMENTS = 0x200 + GAA_FLAG_INCLUDE_TUNNEL_BINDINGORDER = 0x400 +) const ( IF_TYPE_OTHER = 1 @@ -2017,6 +2032,50 @@ const ( IF_TYPE_IEEE1394 = 144 ) +// Enum NL_PREFIX_ORIGIN for [IpAdapterUnicastAddress], see +// https://learn.microsoft.com/en-us/windows/win32/api/nldef/ne-nldef-nl_prefix_origin +const ( + IpPrefixOriginOther = 0 + IpPrefixOriginManual = 1 + IpPrefixOriginWellKnown = 2 + IpPrefixOriginDhcp = 3 + IpPrefixOriginRouterAdvertisement = 4 + IpPrefixOriginUnchanged = 1 << 4 +) + +// Enum NL_SUFFIX_ORIGIN for [IpAdapterUnicastAddress], see +// https://learn.microsoft.com/en-us/windows/win32/api/nldef/ne-nldef-nl_suffix_origin +const ( + NlsoOther = 0 + NlsoManual = 1 + NlsoWellKnown = 2 + NlsoDhcp = 3 + NlsoLinkLayerAddress = 4 + NlsoRandom = 5 + IpSuffixOriginOther = 0 + IpSuffixOriginManual = 1 + IpSuffixOriginWellKnown = 2 + IpSuffixOriginDhcp = 3 + IpSuffixOriginLinkLayerAddress = 4 + IpSuffixOriginRandom = 5 + IpSuffixOriginUnchanged = 1 << 4 +) + +// Enum NL_DAD_STATE for [IpAdapterUnicastAddress], see +// https://learn.microsoft.com/en-us/windows/win32/api/nldef/ne-nldef-nl_dad_state +const ( + NldsInvalid = 0 + NldsTentative = 1 + NldsDuplicate = 2 + NldsDeprecated = 3 + NldsPreferred = 4 + IpDadStateInvalid = 0 + IpDadStateTentative = 1 + IpDadStateDuplicate = 2 + IpDadStateDeprecated = 3 + IpDadStatePreferred = 4 +) + type SocketAddress struct { Sockaddr *syscall.RawSockaddrAny SockaddrLength int32 @@ -3404,3 +3463,14 @@ type DCB struct { EvtChar byte wReserved1 uint16 } + +// Keyboard Layout Flags. +// See https://learn.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-loadkeyboardlayoutw +const ( + KLF_ACTIVATE = 0x00000001 + KLF_SUBSTITUTE_OK = 0x00000002 + KLF_REORDER = 0x00000008 + KLF_REPLACELANG = 0x00000010 + KLF_NOTELLSHELL = 0x00000080 + KLF_SETFORPROCESS = 0x00000100 +) diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index eba761018a..4c2e1bdc01 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -247,7 +247,9 @@ var ( procGetCommandLineW = modkernel32.NewProc("GetCommandLineW") procGetComputerNameExW = modkernel32.NewProc("GetComputerNameExW") procGetComputerNameW = modkernel32.NewProc("GetComputerNameW") + procGetConsoleCP = modkernel32.NewProc("GetConsoleCP") procGetConsoleMode = modkernel32.NewProc("GetConsoleMode") + procGetConsoleOutputCP = modkernel32.NewProc("GetConsoleOutputCP") procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo") procGetCurrentDirectoryW = modkernel32.NewProc("GetCurrentDirectoryW") procGetCurrentProcessId = modkernel32.NewProc("GetCurrentProcessId") @@ -347,8 +349,10 @@ var ( procSetCommMask = modkernel32.NewProc("SetCommMask") procSetCommState = modkernel32.NewProc("SetCommState") procSetCommTimeouts = modkernel32.NewProc("SetCommTimeouts") + procSetConsoleCP = modkernel32.NewProc("SetConsoleCP") procSetConsoleCursorPosition = modkernel32.NewProc("SetConsoleCursorPosition") procSetConsoleMode = modkernel32.NewProc("SetConsoleMode") + procSetConsoleOutputCP = modkernel32.NewProc("SetConsoleOutputCP") procSetCurrentDirectoryW = modkernel32.NewProc("SetCurrentDirectoryW") procSetDefaultDllDirectories = modkernel32.NewProc("SetDefaultDllDirectories") procSetDllDirectoryW = modkernel32.NewProc("SetDllDirectoryW") @@ -478,12 +482,16 @@ var ( procGetDesktopWindow = moduser32.NewProc("GetDesktopWindow") procGetForegroundWindow = moduser32.NewProc("GetForegroundWindow") procGetGUIThreadInfo = moduser32.NewProc("GetGUIThreadInfo") + procGetKeyboardLayout = moduser32.NewProc("GetKeyboardLayout") procGetShellWindow = moduser32.NewProc("GetShellWindow") procGetWindowThreadProcessId = moduser32.NewProc("GetWindowThreadProcessId") procIsWindow = moduser32.NewProc("IsWindow") procIsWindowUnicode = moduser32.NewProc("IsWindowUnicode") procIsWindowVisible = moduser32.NewProc("IsWindowVisible") + procLoadKeyboardLayoutW = moduser32.NewProc("LoadKeyboardLayoutW") procMessageBoxW = moduser32.NewProc("MessageBoxW") + procToUnicodeEx = moduser32.NewProc("ToUnicodeEx") + procUnloadKeyboardLayout = moduser32.NewProc("UnloadKeyboardLayout") procCreateEnvironmentBlock = moduserenv.NewProc("CreateEnvironmentBlock") procDestroyEnvironmentBlock = moduserenv.NewProc("DestroyEnvironmentBlock") procGetUserProfileDirectoryW = moduserenv.NewProc("GetUserProfileDirectoryW") @@ -789,6 +797,14 @@ func FreeSid(sid *SID) (err error) { return } +func GetAce(acl *ACL, aceIndex uint32, pAce **ACCESS_ALLOWED_ACE) (err error) { + r1, _, e1 := syscall.Syscall(procGetAce.Addr(), 3, uintptr(unsafe.Pointer(acl)), uintptr(aceIndex), uintptr(unsafe.Pointer(pAce))) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func GetLengthSid(sid *SID) (len uint32) { r0, _, _ := syscall.Syscall(procGetLengthSid.Addr(), 1, uintptr(unsafe.Pointer(sid)), 0, 0) len = uint32(r0) @@ -1225,14 +1241,6 @@ func setEntriesInAcl(countExplicitEntries uint32, explicitEntries *EXPLICIT_ACCE return } -func GetAce(acl *ACL, aceIndex uint32, pAce **ACCESS_ALLOWED_ACE) (ret error) { - r0, _, _ := syscall.Syscall(procGetAce.Addr(), 3, uintptr(unsafe.Pointer(acl)), uintptr(aceIndex), uintptr(unsafe.Pointer(pAce))) - if r0 == 0 { - ret = GetLastError() - } - return -} - func SetKernelObjectSecurity(handle Handle, securityInformation SECURITY_INFORMATION, securityDescriptor *SECURITY_DESCRIPTOR) (err error) { r1, _, e1 := syscall.Syscall(procSetKernelObjectSecurity.Addr(), 3, uintptr(handle), uintptr(securityInformation), uintptr(unsafe.Pointer(securityDescriptor))) if r1 == 0 { @@ -2158,6 +2166,15 @@ func GetComputerName(buf *uint16, n *uint32) (err error) { return } +func GetConsoleCP() (cp uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetConsoleCP.Addr(), 0, 0, 0, 0) + cp = uint32(r0) + if cp == 0 { + err = errnoErr(e1) + } + return +} + func GetConsoleMode(console Handle, mode *uint32) (err error) { r1, _, e1 := syscall.Syscall(procGetConsoleMode.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(mode)), 0) if r1 == 0 { @@ -2166,6 +2183,15 @@ func GetConsoleMode(console Handle, mode *uint32) (err error) { return } +func GetConsoleOutputCP() (cp uint32, err error) { + r0, _, e1 := syscall.Syscall(procGetConsoleOutputCP.Addr(), 0, 0, 0, 0) + cp = uint32(r0) + if cp == 0 { + err = errnoErr(e1) + } + return +} + func GetConsoleScreenBufferInfo(console Handle, info *ConsoleScreenBufferInfo) (err error) { r1, _, e1 := syscall.Syscall(procGetConsoleScreenBufferInfo.Addr(), 2, uintptr(console), uintptr(unsafe.Pointer(info)), 0) if r1 == 0 { @@ -3034,6 +3060,14 @@ func SetCommTimeouts(handle Handle, timeouts *CommTimeouts) (err error) { return } +func SetConsoleCP(cp uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleCP.Addr(), 1, uintptr(cp), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func setConsoleCursorPosition(console Handle, position uint32) (err error) { r1, _, e1 := syscall.Syscall(procSetConsoleCursorPosition.Addr(), 2, uintptr(console), uintptr(position), 0) if r1 == 0 { @@ -3050,6 +3084,14 @@ func SetConsoleMode(console Handle, mode uint32) (err error) { return } +func SetConsoleOutputCP(cp uint32) (err error) { + r1, _, e1 := syscall.Syscall(procSetConsoleOutputCP.Addr(), 1, uintptr(cp), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func SetCurrentDirectory(path *uint16) (err error) { r1, _, e1 := syscall.Syscall(procSetCurrentDirectoryW.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) if r1 == 0 { @@ -4082,6 +4124,12 @@ func GetGUIThreadInfo(thread uint32, info *GUIThreadInfo) (err error) { return } +func GetKeyboardLayout(tid uint32) (hkl Handle) { + r0, _, _ := syscall.Syscall(procGetKeyboardLayout.Addr(), 1, uintptr(tid), 0, 0) + hkl = Handle(r0) + return +} + func GetShellWindow() (shellWindow HWND) { r0, _, _ := syscall.Syscall(procGetShellWindow.Addr(), 0, 0, 0, 0) shellWindow = HWND(r0) @@ -4115,6 +4163,15 @@ func IsWindowVisible(hwnd HWND) (isVisible bool) { return } +func LoadKeyboardLayout(name *uint16, flags uint32) (hkl Handle, err error) { + r0, _, e1 := syscall.Syscall(procLoadKeyboardLayoutW.Addr(), 2, uintptr(unsafe.Pointer(name)), uintptr(flags), 0) + hkl = Handle(r0) + if hkl == 0 { + err = errnoErr(e1) + } + return +} + func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret int32, err error) { r0, _, e1 := syscall.Syscall6(procMessageBoxW.Addr(), 4, uintptr(hwnd), uintptr(unsafe.Pointer(text)), uintptr(unsafe.Pointer(caption)), uintptr(boxtype), 0, 0) ret = int32(r0) @@ -4124,6 +4181,20 @@ func MessageBox(hwnd HWND, text *uint16, caption *uint16, boxtype uint32) (ret i return } +func ToUnicodeEx(vkey uint32, scancode uint32, keystate *byte, pwszBuff *uint16, cchBuff int32, flags uint32, hkl Handle) (ret int32) { + r0, _, _ := syscall.Syscall9(procToUnicodeEx.Addr(), 7, uintptr(vkey), uintptr(scancode), uintptr(unsafe.Pointer(keystate)), uintptr(unsafe.Pointer(pwszBuff)), uintptr(cchBuff), uintptr(flags), uintptr(hkl), 0, 0) + ret = int32(r0) + return +} + +func UnloadKeyboardLayout(hkl Handle) (err error) { + r1, _, e1 := syscall.Syscall(procUnloadKeyboardLayout.Addr(), 1, uintptr(hkl), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func CreateEnvironmentBlock(block **uint16, token Token, inheritExisting bool) (err error) { var _p0 uint32 if inheritExisting { diff --git a/vendor/golang.org/x/term/LICENSE b/vendor/golang.org/x/term/LICENSE index 6a66aea5ea..2a7cf70da6 100644 --- a/vendor/golang.org/x/term/LICENSE +++ b/vendor/golang.org/x/term/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/golang.org/x/term/term_windows.go b/vendor/golang.org/x/term/term_windows.go index 465f560604..df6bf948e1 100644 --- a/vendor/golang.org/x/term/term_windows.go +++ b/vendor/golang.org/x/term/term_windows.go @@ -26,6 +26,7 @@ func makeRaw(fd int) (*State, error) { return nil, err } raw := st &^ (windows.ENABLE_ECHO_INPUT | windows.ENABLE_PROCESSED_INPUT | windows.ENABLE_LINE_INPUT | windows.ENABLE_PROCESSED_OUTPUT) + raw |= windows.ENABLE_VIRTUAL_TERMINAL_INPUT if err := windows.SetConsoleMode(windows.Handle(fd), raw); err != nil { return nil, err } diff --git a/vendor/golang.org/x/text/LICENSE b/vendor/golang.org/x/text/LICENSE index 6a66aea5ea..2a7cf70da6 100644 --- a/vendor/golang.org/x/text/LICENSE +++ b/vendor/golang.org/x/text/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2009 The Go Authors. All rights reserved. +Copyright 2009 The Go Authors. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -10,7 +10,7 @@ notice, this list of conditions and the following disclaimer. copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Google Inc. nor the names of its + * Neither the name of Google LLC nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/vendor/modules.txt b/vendor/modules.txt index d30f7645b0..f2661bae2b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -545,13 +545,15 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20230225130813-fd77d905589e ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.15.0 +# github.com/ncruces/go-sqlite3 v0.20.2 ## explicit; go 1.21 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed +github.com/ncruces/go-sqlite3/internal/alloc github.com/ncruces/go-sqlite3/internal/util github.com/ncruces/go-sqlite3/util/osutil +github.com/ncruces/go-sqlite3/util/sql3util github.com/ncruces/go-sqlite3/vfs # github.com/ncruces/go-strftime v0.1.9 ## explicit; go 1.17 @@ -704,7 +706,7 @@ github.com/tailscale/wireguard-go/tun # github.com/tcnksm/go-httpstat v0.2.0 ## explicit github.com/tcnksm/go-httpstat -# github.com/tetratelabs/wazero v1.8.0 +# github.com/tetratelabs/wazero v1.8.1 ## explicit; go 1.21 github.com/tetratelabs/wazero github.com/tetratelabs/wazero/api @@ -780,7 +782,7 @@ go4.org/mem # go4.org/netipx v0.0.0-20231129151722-fdeea329fbba ## explicit; go 1.18 go4.org/netipx -# golang.org/x/crypto v0.25.0 +# golang.org/x/crypto v0.28.0 ## explicit; go 1.20 golang.org/x/crypto/acme golang.org/x/crypto/acme/autocert @@ -842,11 +844,11 @@ golang.org/x/net/ipv6 golang.org/x/net/proxy golang.org/x/net/route golang.org/x/net/trace -# golang.org/x/sync v0.7.0 +# golang.org/x/sync v0.8.0 ## explicit; go 1.18 golang.org/x/sync/errgroup golang.org/x/sync/semaphore -# golang.org/x/sys v0.22.0 +# golang.org/x/sys v0.26.0 ## explicit; go 1.18 golang.org/x/sys/cpu golang.org/x/sys/plan9 @@ -855,10 +857,10 @@ golang.org/x/sys/windows golang.org/x/sys/windows/registry golang.org/x/sys/windows/svc golang.org/x/sys/windows/svc/mgr -# golang.org/x/term v0.22.0 +# golang.org/x/term v0.25.0 ## explicit; go 1.18 golang.org/x/term -# golang.org/x/text v0.16.0 +# golang.org/x/text v0.19.0 ## explicit; go 1.18 golang.org/x/text/cases golang.org/x/text/encoding