github.com/segmentio/parquet-go@v0.0.0-20230712180008-5d42db8f0d47/hashprobe/aeshash/aeshash_amd64.s (about) 1 //go:build !purego 2 3 #include "textflag.h" 4 5 // func Hash32(value uint32, seed uintptr) uintptr 6 TEXT ·Hash32(SB), NOSPLIT, $0-24 7 MOVL value+0(FP), AX 8 MOVQ seed+8(FP), BX 9 10 MOVOU runtime·aeskeysched+0(SB), X1 11 MOVOU runtime·aeskeysched+16(SB), X2 12 MOVOU runtime·aeskeysched+32(SB), X3 13 14 MOVQ BX, X0 15 PINSRD $2, AX, X0 16 17 AESENC X1, X0 18 AESENC X2, X0 19 AESENC X3, X0 20 21 MOVQ X0, ret+16(FP) 22 RET 23 24 // func Hash64(value uint64, seed uintptr) uintptr 25 TEXT ·Hash64(SB), NOSPLIT, $0-24 26 MOVQ value+0(FP), AX 27 MOVQ seed+8(FP), BX 28 29 MOVOU runtime·aeskeysched+0(SB), X1 30 MOVOU runtime·aeskeysched+16(SB), X2 31 MOVOU runtime·aeskeysched+32(SB), X3 32 33 MOVQ BX, X0 34 PINSRQ $1, AX, X0 35 36 AESENC X1, X0 37 AESENC X2, X0 38 AESENC X3, X0 39 40 MOVQ X0, ret+16(FP) 41 RET 42 43 // func Hash128(value [16]byte, seed uintptr) uintptr 44 TEXT ·Hash128(SB), NOSPLIT, $0-32 45 LEAQ value+0(FP), AX 46 MOVQ seed+16(FP), BX 47 MOVQ $16, CX 48 49 MOVQ BX, X0 // 64 bits of per-table hash seed 50 PINSRW $4, CX, X0 // 16 bits of length 51 PSHUFHW $0, X0, X0 // repeat length 4 times total 52 PXOR runtime·aeskeysched(SB), X0 // xor in per-process seed 53 AESENC X0, X0 // scramble seed 54 55 MOVOU (AX), X1 56 PXOR X0, X1 57 AESENC X1, X1 58 AESENC X1, X1 59 AESENC X1, X1 60 61 MOVQ X1, ret+24(FP) 62 RET 63 64 // func MultiHashUint32Array(hashes []uintptr, values sparse.Uint32Array, seed uintptr) 65 TEXT ·MultiHashUint32Array(SB), NOSPLIT, $0-56 66 MOVQ hashes_base+0(FP), AX 67 MOVQ values_array_ptr+24(FP), BX 68 MOVQ values_array_len+32(FP), CX 69 MOVQ values_array_off+40(FP), R8 70 MOVQ seed+48(FP), DX 71 72 MOVOU runtime·aeskeysched+0(SB), X1 73 MOVOU runtime·aeskeysched+16(SB), X2 74 MOVOU runtime·aeskeysched+32(SB), X3 75 76 XORQ SI, SI 77 JMP test 78 loop: 79 MOVQ DX, X0 80 PINSRD $2, (BX), X0 81 82 AESENC X1, X0 83 AESENC X2, X0 84 AESENC X3, X0 85 86 MOVQ X0, (AX)(SI*8) 87 INCQ SI 88 ADDQ R8, BX 89 test: 90 CMPQ SI, CX 91 JNE loop 92 RET 93 94 // func MultiHashUint64Array(hashes []uintptr, values sparse.Uint64Array, seed uintptr) 95 TEXT ·MultiHashUint64Array(SB), NOSPLIT, $0-56 96 MOVQ hashes_base+0(FP), AX 97 MOVQ values_array_ptr+24(FP), BX 98 MOVQ values_array_len+32(FP), CX 99 MOVQ values_array_off+40(FP), R8 100 MOVQ seed+48(FP), DX 101 102 MOVOU runtime·aeskeysched+0(SB), X1 103 MOVOU runtime·aeskeysched+16(SB), X2 104 MOVOU runtime·aeskeysched+32(SB), X3 105 106 XORQ SI, SI 107 JMP test 108 loop: 109 MOVQ DX, X0 110 PINSRQ $1, (BX), X0 111 112 AESENC X1, X0 113 AESENC X2, X0 114 AESENC X3, X0 115 116 MOVQ X0, (AX)(SI*8) 117 INCQ SI 118 ADDQ R8, BX 119 test: 120 CMPQ SI, CX 121 JNE loop 122 RET 123 124 // func MultiHashUint128Array(hashes []uintptr, values sparse.Uint128Array, seed uintptr) 125 TEXT ·MultiHashUint128Array(SB), NOSPLIT, $0-56 126 MOVQ hashes_base+0(FP), AX 127 MOVQ values_array_ptr+24(FP), BX 128 MOVQ values_array_len+32(FP), CX 129 MOVQ values_array_off+40(FP), R8 130 MOVQ seed+48(FP), DX 131 MOVQ $16, DI 132 133 MOVQ DX, X0 134 PINSRW $4, DI, X0 135 PSHUFHW $0, X0, X0 136 PXOR runtime·aeskeysched(SB), X0 137 AESENC X0, X0 138 139 XORQ SI, SI 140 JMP test 141 loop: 142 MOVOU (BX), X1 143 144 PXOR X0, X1 145 AESENC X1, X1 146 AESENC X1, X1 147 AESENC X1, X1 148 149 MOVQ X1, (AX)(SI*8) 150 INCQ SI 151 ADDQ R8, BX 152 test: 153 CMPQ SI, CX 154 JNE loop 155 RET