| // Copyright 2026 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. |
| |
| #include "textflag.h" |
| |
| // func MemHash32(p unsafe.Pointer, h uintptr) uintptr |
| TEXT ·MemHash32<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24 |
| MOVB ·UseAeshash(SB), R10 |
| CBZ R10, noaes |
| MOVD $·aeskeysched+0(SB), R3 |
| |
| VEOR V0.B16, V0.B16, V0.B16 |
| VLD1 (R3), [V2.B16] |
| VLD1 (R0), V0.S[2] |
| VMOV R1, V0.D[0] |
| |
| AESE V2.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V2.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V2.B16, V0.B16 |
| |
| VMOV V0.D[0], R0 |
| RET |
| noaes: |
| B ·memHash32Fallback<ABIInternal>(SB) |
| |
| // func MemHash64(p unsafe.Pointer, h uintptr) uintptr |
| TEXT ·MemHash64<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24 |
| MOVB ·UseAeshash(SB), R10 |
| CBZ R10, noaes |
| MOVD $·aeskeysched+0(SB), R3 |
| |
| VEOR V0.B16, V0.B16, V0.B16 |
| VLD1 (R3), [V2.B16] |
| VLD1 (R0), V0.D[1] |
| VMOV R1, V0.D[0] |
| |
| AESE V2.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V2.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V2.B16, V0.B16 |
| |
| VMOV V0.D[0], R0 |
| RET |
| noaes: |
| B ·memHash64Fallback<ABIInternal>(SB) |
| |
| // func MemHash(p unsafe.Pointer, h, size uintptr) uintptr |
| TEXT ·MemHash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-32 |
| MOVB ·UseAeshash(SB), R10 |
| CBZ R10, noaes |
| B ·aeshashbody<>(SB) |
| noaes: |
| B ·memHashFallback<ABIInternal>(SB) |
| |
| // func StrHash(p unsafe.Pointer, h uintptr) uintptr |
| TEXT ·StrHash<ABIInternal>(SB),NOSPLIT|NOFRAME,$0-24 |
| MOVB ·UseAeshash(SB), R10 |
| CBZ R10, noaes |
| LDP (R0), (R0, R2) // string data / length |
| B ·aeshashbody<>(SB) |
| noaes: |
| B ·strHashFallback<ABIInternal>(SB) |
| |
| // R0: data |
| // R1: seed data |
| // R2: length |
| // At return, R0 = return value |
| TEXT ·aeshashbody<>(SB),NOSPLIT|NOFRAME,$0 |
| VEOR V30.B16, V30.B16, V30.B16 |
| VMOV R1, V30.D[0] |
| VMOV R2, V30.D[1] // load length into seed |
| |
| MOVD $·aeskeysched+0(SB), R4 |
| VLD1.P 16(R4), [V0.B16] |
| AESE V30.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| CMP $16, R2 |
| BLO aes0to15 |
| BEQ aes16 |
| CMP $32, R2 |
| BLS aes17to32 |
| CMP $64, R2 |
| BLS aes33to64 |
| CMP $128, R2 |
| BLS aes65to128 |
| B aes129plus |
| |
| aes0to15: |
| CBZ R2, aes0 |
| VEOR V2.B16, V2.B16, V2.B16 |
| TBZ $3, R2, less_than_8 |
| VLD1.P 8(R0), V2.D[0] |
| |
| less_than_8: |
| TBZ $2, R2, less_than_4 |
| VLD1.P 4(R0), V2.S[2] |
| |
| less_than_4: |
| TBZ $1, R2, less_than_2 |
| VLD1.P 2(R0), V2.H[6] |
| |
| less_than_2: |
| TBZ $0, R2, done |
| VLD1 (R0), V2.B[14] |
| done: |
| AESE V0.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V0.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V0.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| |
| VMOV V2.D[0], R0 |
| RET |
| |
| aes0: |
| VMOV V0.D[0], R0 |
| RET |
| |
| aes16: |
| VLD1 (R0), [V2.B16] |
| B done |
| |
| aes17to32: |
| // make second seed |
| VLD1 (R4), [V1.B16] |
| AESE V30.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| SUB $16, R2, R10 |
| VLD1.P (R0)(R10), [V2.B16] |
| VLD1 (R0), [V3.B16] |
| |
| AESE V0.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V1.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| |
| AESE V0.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V1.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| |
| AESE V0.B16, V2.B16 |
| AESE V1.B16, V3.B16 |
| |
| VEOR V3.B16, V2.B16, V2.B16 |
| |
| VMOV V2.D[0], R0 |
| RET |
| |
| aes33to64: |
| VLD1 (R4), [V1.B16, V2.B16, V3.B16] |
| AESE V30.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V30.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V30.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| SUB $32, R2, R10 |
| |
| VLD1.P (R0)(R10), [V4.B16, V5.B16] |
| VLD1 (R0), [V6.B16, V7.B16] |
| |
| AESE V0.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V1.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V2.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V3.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| AESE V0.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V1.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V2.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V3.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| AESE V0.B16, V4.B16 |
| AESE V1.B16, V5.B16 |
| AESE V2.B16, V6.B16 |
| AESE V3.B16, V7.B16 |
| |
| VEOR V6.B16, V4.B16, V4.B16 |
| VEOR V7.B16, V5.B16, V5.B16 |
| VEOR V5.B16, V4.B16, V4.B16 |
| |
| VMOV V4.D[0], R0 |
| RET |
| |
| aes65to128: |
| VLD1.P 64(R4), [V1.B16, V2.B16, V3.B16, V4.B16] |
| VLD1 (R4), [V5.B16, V6.B16, V7.B16] |
| AESE V30.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V30.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V30.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| AESE V30.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V30.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V30.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V30.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| SUB $64, R2, R10 |
| VLD1.P (R0)(R10), [V8.B16, V9.B16, V10.B16, V11.B16] |
| VLD1 (R0), [V12.B16, V13.B16, V14.B16, V15.B16] |
| AESE V0.B16, V8.B16 |
| AESMC V8.B16, V8.B16 |
| AESE V1.B16, V9.B16 |
| AESMC V9.B16, V9.B16 |
| AESE V2.B16, V10.B16 |
| AESMC V10.B16, V10.B16 |
| AESE V3.B16, V11.B16 |
| AESMC V11.B16, V11.B16 |
| AESE V4.B16, V12.B16 |
| AESMC V12.B16, V12.B16 |
| AESE V5.B16, V13.B16 |
| AESMC V13.B16, V13.B16 |
| AESE V6.B16, V14.B16 |
| AESMC V14.B16, V14.B16 |
| AESE V7.B16, V15.B16 |
| AESMC V15.B16, V15.B16 |
| |
| AESE V0.B16, V8.B16 |
| AESMC V8.B16, V8.B16 |
| AESE V1.B16, V9.B16 |
| AESMC V9.B16, V9.B16 |
| AESE V2.B16, V10.B16 |
| AESMC V10.B16, V10.B16 |
| AESE V3.B16, V11.B16 |
| AESMC V11.B16, V11.B16 |
| AESE V4.B16, V12.B16 |
| AESMC V12.B16, V12.B16 |
| AESE V5.B16, V13.B16 |
| AESMC V13.B16, V13.B16 |
| AESE V6.B16, V14.B16 |
| AESMC V14.B16, V14.B16 |
| AESE V7.B16, V15.B16 |
| AESMC V15.B16, V15.B16 |
| |
| AESE V0.B16, V8.B16 |
| AESE V1.B16, V9.B16 |
| AESE V2.B16, V10.B16 |
| AESE V3.B16, V11.B16 |
| AESE V4.B16, V12.B16 |
| AESE V5.B16, V13.B16 |
| AESE V6.B16, V14.B16 |
| AESE V7.B16, V15.B16 |
| |
| VEOR V12.B16, V8.B16, V8.B16 |
| VEOR V13.B16, V9.B16, V9.B16 |
| VEOR V14.B16, V10.B16, V10.B16 |
| VEOR V15.B16, V11.B16, V11.B16 |
| VEOR V10.B16, V8.B16, V8.B16 |
| VEOR V11.B16, V9.B16, V9.B16 |
| VEOR V9.B16, V8.B16, V8.B16 |
| |
| VMOV V8.D[0], R0 |
| RET |
| |
| aes129plus: |
| PRFM (R0), PLDL1KEEP |
| VLD1.P 64(R4), [V1.B16, V2.B16, V3.B16, V4.B16] |
| VLD1 (R4), [V5.B16, V6.B16, V7.B16] |
| AESE V30.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V30.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V30.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| AESE V30.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V30.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V30.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V30.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| ADD R0, R2, R10 |
| SUB $128, R10, R10 |
| VLD1.P 64(R10), [V8.B16, V9.B16, V10.B16, V11.B16] |
| VLD1 (R10), [V12.B16, V13.B16, V14.B16, V15.B16] |
| SUB $1, R2, R2 |
| LSR $7, R2, R2 |
| |
| aesloop: |
| AESE V8.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V9.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V10.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V11.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| AESE V12.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V13.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V14.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V15.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| VLD1.P 64(R0), [V8.B16, V9.B16, V10.B16, V11.B16] |
| AESE V8.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V9.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V10.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V11.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| |
| VLD1.P 64(R0), [V12.B16, V13.B16, V14.B16, V15.B16] |
| AESE V12.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V13.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V14.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V15.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| SUB $1, R2, R2 |
| CBNZ R2, aesloop |
| |
| AESE V8.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V9.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V10.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V11.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| AESE V12.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V13.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V14.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V15.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| AESE V8.B16, V0.B16 |
| AESMC V0.B16, V0.B16 |
| AESE V9.B16, V1.B16 |
| AESMC V1.B16, V1.B16 |
| AESE V10.B16, V2.B16 |
| AESMC V2.B16, V2.B16 |
| AESE V11.B16, V3.B16 |
| AESMC V3.B16, V3.B16 |
| AESE V12.B16, V4.B16 |
| AESMC V4.B16, V4.B16 |
| AESE V13.B16, V5.B16 |
| AESMC V5.B16, V5.B16 |
| AESE V14.B16, V6.B16 |
| AESMC V6.B16, V6.B16 |
| AESE V15.B16, V7.B16 |
| AESMC V7.B16, V7.B16 |
| |
| AESE V8.B16, V0.B16 |
| AESE V9.B16, V1.B16 |
| AESE V10.B16, V2.B16 |
| AESE V11.B16, V3.B16 |
| AESE V12.B16, V4.B16 |
| AESE V13.B16, V5.B16 |
| AESE V14.B16, V6.B16 |
| AESE V15.B16, V7.B16 |
| |
| VEOR V0.B16, V1.B16, V0.B16 |
| VEOR V2.B16, V3.B16, V2.B16 |
| VEOR V4.B16, V5.B16, V4.B16 |
| VEOR V6.B16, V7.B16, V6.B16 |
| VEOR V0.B16, V2.B16, V0.B16 |
| VEOR V4.B16, V6.B16, V4.B16 |
| VEOR V4.B16, V0.B16, V0.B16 |
| |
| VMOV V0.D[0], R0 |
| RET |