aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/go/_std_1.22/src/crypto/subtle
diff options
context:
space:
mode:
authormaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 12:29:46 +0300
committermaxim-yurchuk <maxim-yurchuk@yandex-team.com>2024-10-09 13:14:22 +0300
commit9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80 (patch)
treea8fb3181d5947c0d78cf402aa56e686130179049 /contrib/go/_std_1.22/src/crypto/subtle
parenta44b779cd359f06c3ebbef4ec98c6b38609d9d85 (diff)
downloadydb-9731d8a4bb7ee2cc8554eaf133bb85498a4c7d80.tar.gz
publishFullContrib: true for ydb
<HIDDEN_URL> commit_hash:c82a80ac4594723cebf2c7387dec9c60217f603e
Diffstat (limited to 'contrib/go/_std_1.22/src/crypto/subtle')
-rw-r--r--contrib/go/_std_1.22/src/crypto/subtle/xor_generic.go64
-rw-r--r--contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.go10
-rw-r--r--contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.s142
3 files changed, 216 insertions, 0 deletions
diff --git a/contrib/go/_std_1.22/src/crypto/subtle/xor_generic.go b/contrib/go/_std_1.22/src/crypto/subtle/xor_generic.go
new file mode 100644
index 0000000000..7dc89e315b
--- /dev/null
+++ b/contrib/go/_std_1.22/src/crypto/subtle/xor_generic.go
@@ -0,0 +1,64 @@
+// Copyright 2013 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 (!amd64 && !arm64 && !ppc64 && !ppc64le) || purego
+
+package subtle
+
+import (
+ "runtime"
+ "unsafe"
+)
+
+const wordSize = unsafe.Sizeof(uintptr(0))
+
+const supportsUnaligned = runtime.GOARCH == "386" ||
+ runtime.GOARCH == "amd64" ||
+ runtime.GOARCH == "ppc64" ||
+ runtime.GOARCH == "ppc64le" ||
+ runtime.GOARCH == "s390x"
+
+func xorBytes(dstb, xb, yb *byte, n int) {
+ // xorBytes assembly is written using pointers and n. Back to slices.
+ dst := unsafe.Slice(dstb, n)
+ x := unsafe.Slice(xb, n)
+ y := unsafe.Slice(yb, n)
+
+ if supportsUnaligned || aligned(dstb, xb, yb) {
+ xorLoop(words(dst), words(x), words(y))
+ if uintptr(n)%wordSize == 0 {
+ return
+ }
+ done := n &^ int(wordSize-1)
+ dst = dst[done:]
+ x = x[done:]
+ y = y[done:]
+ }
+ xorLoop(dst, x, y)
+}
+
+// aligned reports whether dst, x, and y are all word-aligned pointers.
+func aligned(dst, x, y *byte) bool {
+ return (uintptr(unsafe.Pointer(dst))|uintptr(unsafe.Pointer(x))|uintptr(unsafe.Pointer(y)))&(wordSize-1) == 0
+}
+
+// words returns a []uintptr pointing at the same data as x,
+// with any trailing partial word removed.
+func words(x []byte) []uintptr {
+ n := uintptr(len(x)) / wordSize
+ if n == 0 {
+ // Avoid creating a *uintptr that refers to data smaller than a uintptr;
+ // see issue 59334.
+ return nil
+ }
+ return unsafe.Slice((*uintptr)(unsafe.Pointer(&x[0])), n)
+}
+
+func xorLoop[T byte | uintptr](dst, x, y []T) {
+ x = x[:len(dst)] // remove bounds check in loop
+ y = y[:len(dst)] // remove bounds check in loop
+ for i := range dst {
+ dst[i] = x[i] ^ y[i]
+ }
+}
diff --git a/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.go b/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.go
new file mode 100644
index 0000000000..760463c7e5
--- /dev/null
+++ b/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.go
@@ -0,0 +1,10 @@
+// Copyright 2018 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 (ppc64 || ppc64le) && !purego
+
+package subtle
+
+//go:noescape
+func xorBytes(dst, a, b *byte, n int)
diff --git a/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.s b/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.s
new file mode 100644
index 0000000000..0de4350cb2
--- /dev/null
+++ b/contrib/go/_std_1.22/src/crypto/subtle/xor_ppc64x.s
@@ -0,0 +1,142 @@
+// Copyright 2018 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 (ppc64 || ppc64le) && !purego
+
+#include "textflag.h"
+
+// func xorBytes(dst, a, b *byte, n int)
+TEXT ·xorBytes(SB), NOSPLIT, $0
+ MOVD dst+0(FP), R3 // R3 = dst
+ MOVD a+8(FP), R4 // R4 = a
+ MOVD b+16(FP), R5 // R5 = b
+ MOVD n+24(FP), R6 // R6 = n
+
+ CMPU R6, $64, CR7 // Check if n ≥ 64 bytes
+ MOVD R0, R8 // R8 = index
+ CMPU R6, $8, CR6 // Check if 8 ≤ n < 64 bytes
+ BLE CR6, small // <= 8
+ BLT CR7, xor32 // Case for 32 ≤ n < 64 bytes
+
+ // Case for n ≥ 64 bytes
+preloop64:
+ SRD $6, R6, R7 // Set up loop counter
+ MOVD R7, CTR
+ MOVD $16, R10
+ MOVD $32, R14
+ MOVD $48, R15
+ ANDCC $63, R6, R9 // Check for tailing bytes for later
+ PCALIGN $16
+ // Case for >= 64 bytes
+ // Process 64 bytes per iteration
+ // Load 4 vectors of a and b
+ // XOR the corresponding vectors
+ // from a and b and store the result
+loop64:
+ LXVD2X (R4)(R8), VS32
+ LXVD2X (R4)(R10), VS34
+ LXVD2X (R4)(R14), VS36
+ LXVD2X (R4)(R15), VS38
+ LXVD2X (R5)(R8), VS33
+ LXVD2X (R5)(R10), VS35
+ LXVD2X (R5)(R14), VS37
+ LXVD2X (R5)(R15), VS39
+ XXLXOR VS32, VS33, VS32
+ XXLXOR VS34, VS35, VS34
+ XXLXOR VS36, VS37, VS36
+ XXLXOR VS38, VS39, VS38
+ STXVD2X VS32, (R3)(R8)
+ STXVD2X VS34, (R3)(R10)
+ STXVD2X VS36, (R3)(R14)
+ STXVD2X VS38, (R3)(R15)
+ ADD $64, R8
+ ADD $64, R10
+ ADD $64, R14
+ ADD $64, R15
+ BDNZ loop64
+ BC 12,2,LR // BEQLR
+ MOVD R9, R6
+ CMP R6, $8
+ BLE small
+ // Case for 8 <= n < 64 bytes
+ // Process 32 bytes if available
+xor32:
+ CMP R6, $32
+ BLT xor16
+ ADD $16, R8, R9
+ LXVD2X (R4)(R8), VS32
+ LXVD2X (R4)(R9), VS33
+ LXVD2X (R5)(R8), VS34
+ LXVD2X (R5)(R9), VS35
+ XXLXOR VS32, VS34, VS32
+ XXLXOR VS33, VS35, VS33
+ STXVD2X VS32, (R3)(R8)
+ STXVD2X VS33, (R3)(R9)
+ ADD $32, R8
+ ADD $-32, R6
+ CMP R6, $8
+ BLE small
+ // Case for 8 <= n < 32 bytes
+ // Process 16 bytes if available
+xor16:
+ CMP R6, $16
+ BLT xor8
+ LXVD2X (R4)(R8), VS32
+ LXVD2X (R5)(R8), VS33
+ XXLXOR VS32, VS33, VS32
+ STXVD2X VS32, (R3)(R8)
+ ADD $16, R8
+ ADD $-16, R6
+small:
+ CMP R6, R0
+ BC 12,2,LR // BEQLR
+xor8:
+#ifdef GOPPC64_power10
+ SLD $56,R6,R17
+ ADD R4,R8,R18
+ ADD R5,R8,R19
+ ADD R3,R8,R20
+ LXVL R18,R17,V0
+ LXVL R19,R17,V1
+ VXOR V0,V1,V1
+ STXVL V1,R20,R17
+ RET
+#else
+ CMP R6, $8
+ BLT xor4
+ // Case for 8 ≤ n < 16 bytes
+ MOVD (R4)(R8), R14 // R14 = a[i,...,i+7]
+ MOVD (R5)(R8), R15 // R15 = b[i,...,i+7]
+ XOR R14, R15, R16 // R16 = a[] ^ b[]
+ SUB $8, R6 // n = n - 8
+ MOVD R16, (R3)(R8) // Store to dst
+ ADD $8, R8
+xor4:
+ CMP R6, $4
+ BLT xor2
+ MOVWZ (R4)(R8), R14
+ MOVWZ (R5)(R8), R15
+ XOR R14, R15, R16
+ MOVW R16, (R3)(R8)
+ ADD $4,R8
+ ADD $-4,R6
+xor2:
+ CMP R6, $2
+ BLT xor1
+ MOVHZ (R4)(R8), R14
+ MOVHZ (R5)(R8), R15
+ XOR R14, R15, R16
+ MOVH R16, (R3)(R8)
+ ADD $2,R8
+ ADD $-2,R6
+xor1:
+ CMP R6, R0
+ BC 12,2,LR // BEQLR
+ MOVBZ (R4)(R8), R14 // R14 = a[i]
+ MOVBZ (R5)(R8), R15 // R15 = b[i]
+ XOR R14, R15, R16 // R16 = a[i] ^ b[i]
+ MOVB R16, (R3)(R8) // Store to dst
+#endif
+done:
+ RET