mirror of
https://github.com/hanzoai/datastore.git
synced 2026-10-30 14:48:37 +00:00
497 lines
11 KiB
ArmAsm
497 lines
11 KiB
ArmAsm
.text
|
|
|
|
.type __KeccakF1600,@function
|
|
.align 32
|
|
__KeccakF1600:
|
|
lea iotas(%rip),%r10
|
|
mov $12,%eax
|
|
jmp .Loop_avx512
|
|
|
|
.align 32
|
|
.Loop_avx512:
|
|
######################################### Theta, even round
|
|
vmovdqa64 %zmm0,%zmm5 # put aside original A00
|
|
vpternlogq $0x96,%zmm2,%zmm1,%zmm0 # and use it as "C00"
|
|
vpternlogq $0x96,%zmm4,%zmm3,%zmm0
|
|
|
|
vprolq $1,%zmm0,%zmm6
|
|
vpermq %zmm0,%zmm13,%zmm0
|
|
vpermq %zmm6,%zmm16,%zmm6
|
|
|
|
vpternlogq $0x96,%zmm0,%zmm6,%zmm5 # T[0] is original A00
|
|
vpternlogq $0x96,%zmm0,%zmm6,%zmm1
|
|
vpternlogq $0x96,%zmm0,%zmm6,%zmm2
|
|
vpternlogq $0x96,%zmm0,%zmm6,%zmm3
|
|
vpternlogq $0x96,%zmm0,%zmm6,%zmm4
|
|
|
|
######################################### Rho
|
|
vprolvq %zmm22,%zmm5,%zmm0 # T[0] is original A00
|
|
vprolvq %zmm23,%zmm1,%zmm1
|
|
vprolvq %zmm24,%zmm2,%zmm2
|
|
vprolvq %zmm25,%zmm3,%zmm3
|
|
vprolvq %zmm26,%zmm4,%zmm4
|
|
|
|
######################################### Pi
|
|
vpermq %zmm0,%zmm17,%zmm0
|
|
vpermq %zmm1,%zmm18,%zmm1
|
|
vpermq %zmm2,%zmm19,%zmm2
|
|
vpermq %zmm3,%zmm20,%zmm3
|
|
vpermq %zmm4,%zmm21,%zmm4
|
|
|
|
######################################### Chi
|
|
vmovdqa64 %zmm0,%zmm5
|
|
vmovdqa64 %zmm1,%zmm6
|
|
vpternlogq $0xD2,%zmm2,%zmm1,%zmm0
|
|
vpternlogq $0xD2,%zmm3,%zmm2,%zmm1
|
|
vpternlogq $0xD2,%zmm4,%zmm3,%zmm2
|
|
vpternlogq $0xD2,%zmm5,%zmm4,%zmm3
|
|
vpternlogq $0xD2,%zmm6,%zmm5,%zmm4
|
|
|
|
######################################### Iota
|
|
vpxorq (%r10),%zmm0,%zmm0{%k1}
|
|
lea 16(%r10),%r10
|
|
|
|
######################################### Harmonize rounds
|
|
vpblendmq %zmm2,%zmm1,%zmm6{%k2}
|
|
vpblendmq %zmm3,%zmm2,%zmm7{%k2}
|
|
vpblendmq %zmm4,%zmm3,%zmm8{%k2}
|
|
vpblendmq %zmm1,%zmm0,%zmm5{%k2}
|
|
vpblendmq %zmm0,%zmm4,%zmm9{%k2}
|
|
|
|
vpblendmq %zmm3,%zmm6,%zmm6{%k3}
|
|
vpblendmq %zmm4,%zmm7,%zmm7{%k3}
|
|
vpblendmq %zmm2,%zmm5,%zmm5{%k3}
|
|
vpblendmq %zmm0,%zmm8,%zmm8{%k3}
|
|
vpblendmq %zmm1,%zmm9,%zmm9{%k3}
|
|
|
|
vpblendmq %zmm4,%zmm6,%zmm6{%k4}
|
|
vpblendmq %zmm3,%zmm5,%zmm5{%k4}
|
|
vpblendmq %zmm0,%zmm7,%zmm7{%k4}
|
|
vpblendmq %zmm1,%zmm8,%zmm8{%k4}
|
|
vpblendmq %zmm2,%zmm9,%zmm9{%k4}
|
|
|
|
vpblendmq %zmm4,%zmm5,%zmm5{%k5}
|
|
vpblendmq %zmm0,%zmm6,%zmm6{%k5}
|
|
vpblendmq %zmm1,%zmm7,%zmm7{%k5}
|
|
vpblendmq %zmm2,%zmm8,%zmm8{%k5}
|
|
vpblendmq %zmm3,%zmm9,%zmm9{%k5}
|
|
|
|
#vpermq %zmm5,%zmm33,%zmm0 # doesn't actually change order
|
|
vpermq %zmm6,%zmm13,%zmm1
|
|
vpermq %zmm7,%zmm14,%zmm2
|
|
vpermq %zmm8,%zmm15,%zmm3
|
|
vpermq %zmm9,%zmm16,%zmm4
|
|
|
|
######################################### Theta, odd round
|
|
vmovdqa64 %zmm5,%zmm0 # real A00
|
|
vpternlogq $0x96,%zmm2,%zmm1,%zmm5 # C00 is %zmm5's alias
|
|
vpternlogq $0x96,%zmm4,%zmm3,%zmm5
|
|
|
|
vprolq $1,%zmm5,%zmm6
|
|
vpermq %zmm5,%zmm13,%zmm5
|
|
vpermq %zmm6,%zmm16,%zmm6
|
|
|
|
vpternlogq $0x96,%zmm5,%zmm6,%zmm0
|
|
vpternlogq $0x96,%zmm5,%zmm6,%zmm3
|
|
vpternlogq $0x96,%zmm5,%zmm6,%zmm1
|
|
vpternlogq $0x96,%zmm5,%zmm6,%zmm4
|
|
vpternlogq $0x96,%zmm5,%zmm6,%zmm2
|
|
|
|
######################################### Rho
|
|
vprolvq %zmm27,%zmm0,%zmm0
|
|
vprolvq %zmm30,%zmm3,%zmm6
|
|
vprolvq %zmm28,%zmm1,%zmm7
|
|
vprolvq %zmm31,%zmm4,%zmm8
|
|
vprolvq %zmm29,%zmm2,%zmm9
|
|
|
|
vpermq %zmm0,%zmm16,%zmm10
|
|
vpermq %zmm0,%zmm15,%zmm11
|
|
|
|
######################################### Iota
|
|
vpxorq -8(%r10),%zmm0,%zmm0{%k1}
|
|
|
|
######################################### Pi
|
|
vpermq %zmm6,%zmm14,%zmm1
|
|
vpermq %zmm7,%zmm16,%zmm2
|
|
vpermq %zmm8,%zmm13,%zmm3
|
|
vpermq %zmm9,%zmm15,%zmm4
|
|
|
|
######################################### Chi
|
|
vpternlogq $0xD2,%zmm11,%zmm10,%zmm0
|
|
|
|
vpermq %zmm6,%zmm13,%zmm12
|
|
#vpermq %zmm6,%zmm33,%zmm6
|
|
vpternlogq $0xD2,%zmm6,%zmm12,%zmm1
|
|
|
|
vpermq %zmm7,%zmm15,%zmm5
|
|
vpermq %zmm7,%zmm14,%zmm7
|
|
vpternlogq $0xD2,%zmm7,%zmm5,%zmm2
|
|
|
|
#vpermq %zmm8,%zmm33,%zmm8
|
|
vpermq %zmm8,%zmm16,%zmm6
|
|
vpternlogq $0xD2,%zmm6,%zmm8,%zmm3
|
|
|
|
vpermq %zmm9,%zmm14,%zmm5
|
|
vpermq %zmm9,%zmm13,%zmm9
|
|
vpternlogq $0xD2,%zmm9,%zmm5,%zmm4
|
|
|
|
dec %eax
|
|
jnz .Loop_avx512
|
|
|
|
ret
|
|
.size __KeccakF1600,.-__KeccakF1600
|
|
.globl SHA3_absorb
|
|
.type SHA3_absorb,@function
|
|
.align 32
|
|
SHA3_absorb:
|
|
mov %rsp,%r11
|
|
|
|
lea -320(%rsp),%rsp
|
|
and $-64,%rsp
|
|
|
|
lea 96(%rdi),%rdi
|
|
lea 96(%rsi),%rsi
|
|
lea 128(%rsp),%r9
|
|
|
|
lea theta_perm(%rip),%r8
|
|
|
|
kxnorw %k6,%k6,%k6
|
|
kshiftrw $15,%k6,%k1
|
|
kshiftrw $11,%k6,%k6
|
|
kshiftlw $1,%k1,%k2
|
|
kshiftlw $2,%k1,%k3
|
|
kshiftlw $3,%k1,%k4
|
|
kshiftlw $4,%k1,%k5
|
|
|
|
#vmovdqa64 64*0(%r8),%zmm33
|
|
vmovdqa64 64*1(%r8),%zmm13
|
|
vmovdqa64 64*2(%r8),%zmm14
|
|
vmovdqa64 64*3(%r8),%zmm15
|
|
vmovdqa64 64*4(%r8),%zmm16
|
|
|
|
vmovdqa64 64*5(%r8),%zmm27
|
|
vmovdqa64 64*6(%r8),%zmm28
|
|
vmovdqa64 64*7(%r8),%zmm29
|
|
vmovdqa64 64*8(%r8),%zmm30
|
|
vmovdqa64 64*9(%r8),%zmm31
|
|
|
|
vmovdqa64 64*10(%r8),%zmm22
|
|
vmovdqa64 64*11(%r8),%zmm23
|
|
vmovdqa64 64*12(%r8),%zmm24
|
|
vmovdqa64 64*13(%r8),%zmm25
|
|
vmovdqa64 64*14(%r8),%zmm26
|
|
|
|
vmovdqa64 64*15(%r8),%zmm17
|
|
vmovdqa64 64*16(%r8),%zmm18
|
|
vmovdqa64 64*17(%r8),%zmm19
|
|
vmovdqa64 64*18(%r8),%zmm20
|
|
vmovdqa64 64*19(%r8),%zmm21
|
|
|
|
vmovdqu64 40*0-96(%rdi),%zmm0{%k6}{z}
|
|
vpxorq %zmm5,%zmm5,%zmm5
|
|
vmovdqu64 40*1-96(%rdi),%zmm1{%k6}{z}
|
|
vmovdqu64 40*2-96(%rdi),%zmm2{%k6}{z}
|
|
vmovdqu64 40*3-96(%rdi),%zmm3{%k6}{z}
|
|
vmovdqu64 40*4-96(%rdi),%zmm4{%k6}{z}
|
|
|
|
vmovdqa64 %zmm5,0*64-128(%r9) # zero transfer area on stack
|
|
vmovdqa64 %zmm5,1*64-128(%r9)
|
|
vmovdqa64 %zmm5,2*64-128(%r9)
|
|
vmovdqa64 %zmm5,3*64-128(%r9)
|
|
vmovdqa64 %zmm5,4*64-128(%r9)
|
|
jmp .Loop_absorb_avx512
|
|
|
|
.align 32
|
|
.Loop_absorb_avx512:
|
|
mov %rcx,%rax
|
|
sub %rcx,%rdx
|
|
jc .Ldone_absorb_avx512
|
|
|
|
shr $3,%eax
|
|
mov 8*0-96(%rsi),%r8
|
|
mov %r8,0-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*1-96(%rsi),%r8
|
|
mov %r8,8-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*2-96(%rsi),%r8
|
|
mov %r8,16-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*3-96(%rsi),%r8
|
|
mov %r8,24-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*4-96(%rsi),%r8
|
|
mov %r8,32-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*5-96(%rsi),%r8
|
|
mov %r8,64-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*6-96(%rsi),%r8
|
|
mov %r8,72-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*7-96(%rsi),%r8
|
|
mov %r8,80-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*8-96(%rsi),%r8
|
|
mov %r8,88-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*9-96(%rsi),%r8
|
|
mov %r8,96-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*10-96(%rsi),%r8
|
|
mov %r8,128-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*11-96(%rsi),%r8
|
|
mov %r8,136-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*12-96(%rsi),%r8
|
|
mov %r8,144-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*13-96(%rsi),%r8
|
|
mov %r8,152-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*14-96(%rsi),%r8
|
|
mov %r8,160-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*15-96(%rsi),%r8
|
|
mov %r8,192-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*16-96(%rsi),%r8
|
|
mov %r8,200-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*17-96(%rsi),%r8
|
|
mov %r8,208-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*18-96(%rsi),%r8
|
|
mov %r8,216-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*19-96(%rsi),%r8
|
|
mov %r8,224-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*20-96(%rsi),%r8
|
|
mov %r8,256-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*21-96(%rsi),%r8
|
|
mov %r8,264-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*22-96(%rsi),%r8
|
|
mov %r8,272-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*23-96(%rsi),%r8
|
|
mov %r8,280-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
mov 8*24-96(%rsi),%r8
|
|
mov %r8,288-128(%r9)
|
|
dec %eax
|
|
jz .Labsorved_avx512
|
|
.Labsorved_avx512:
|
|
lea (%rsi,%rcx),%rsi
|
|
|
|
vpxorq 64*0-128(%r9),%zmm0,%zmm0
|
|
vpxorq 64*1-128(%r9),%zmm1,%zmm1
|
|
vpxorq 64*2-128(%r9),%zmm2,%zmm2
|
|
vpxorq 64*3-128(%r9),%zmm3,%zmm3
|
|
vpxorq 64*4-128(%r9),%zmm4,%zmm4
|
|
|
|
call __KeccakF1600
|
|
|
|
jmp .Loop_absorb_avx512
|
|
|
|
.align 32
|
|
.Ldone_absorb_avx512:
|
|
vmovdqu64 %zmm0,40*0-96(%rdi){%k6}
|
|
vmovdqu64 %zmm1,40*1-96(%rdi){%k6}
|
|
vmovdqu64 %zmm2,40*2-96(%rdi){%k6}
|
|
vmovdqu64 %zmm3,40*3-96(%rdi){%k6}
|
|
vmovdqu64 %zmm4,40*4-96(%rdi){%k6}
|
|
|
|
vzeroupper
|
|
|
|
lea (%r11),%rsp
|
|
lea (%rdx,%rcx),%rax # return value
|
|
ret
|
|
.size SHA3_absorb,.-SHA3_absorb
|
|
|
|
.globl SHA3_squeeze
|
|
.type SHA3_squeeze,@function
|
|
.align 32
|
|
SHA3_squeeze:
|
|
mov %rsp,%r11
|
|
|
|
lea 96(%rdi),%rdi
|
|
cmp %rcx,%rdx
|
|
jbe .Lno_output_extension_avx512
|
|
|
|
lea theta_perm(%rip),%r8
|
|
|
|
kxnorw %k6,%k6,%k6
|
|
kshiftrw $15,%k6,%k1
|
|
kshiftrw $11,%k6,%k6
|
|
kshiftlw $1,%k1,%k2
|
|
kshiftlw $2,%k1,%k3
|
|
kshiftlw $3,%k1,%k4
|
|
kshiftlw $4,%k1,%k5
|
|
|
|
#vmovdqa64 64*0(%r8),%zmm33
|
|
vmovdqa64 64*1(%r8),%zmm13
|
|
vmovdqa64 64*2(%r8),%zmm14
|
|
vmovdqa64 64*3(%r8),%zmm15
|
|
vmovdqa64 64*4(%r8),%zmm16
|
|
|
|
vmovdqa64 64*5(%r8),%zmm27
|
|
vmovdqa64 64*6(%r8),%zmm28
|
|
vmovdqa64 64*7(%r8),%zmm29
|
|
vmovdqa64 64*8(%r8),%zmm30
|
|
vmovdqa64 64*9(%r8),%zmm31
|
|
|
|
vmovdqa64 64*10(%r8),%zmm22
|
|
vmovdqa64 64*11(%r8),%zmm23
|
|
vmovdqa64 64*12(%r8),%zmm24
|
|
vmovdqa64 64*13(%r8),%zmm25
|
|
vmovdqa64 64*14(%r8),%zmm26
|
|
|
|
vmovdqa64 64*15(%r8),%zmm17
|
|
vmovdqa64 64*16(%r8),%zmm18
|
|
vmovdqa64 64*17(%r8),%zmm19
|
|
vmovdqa64 64*18(%r8),%zmm20
|
|
vmovdqa64 64*19(%r8),%zmm21
|
|
|
|
vmovdqu64 40*0-96(%rdi),%zmm0{%k6}{z}
|
|
vmovdqu64 40*1-96(%rdi),%zmm1{%k6}{z}
|
|
vmovdqu64 40*2-96(%rdi),%zmm2{%k6}{z}
|
|
vmovdqu64 40*3-96(%rdi),%zmm3{%k6}{z}
|
|
vmovdqu64 40*4-96(%rdi),%zmm4{%k6}{z}
|
|
|
|
.Lno_output_extension_avx512:
|
|
shr $3,%rcx
|
|
lea -96(%rdi),%r9
|
|
mov %rcx,%rax
|
|
jmp .Loop_squeeze_avx512
|
|
|
|
.align 32
|
|
.Loop_squeeze_avx512:
|
|
cmp $8,%rdx
|
|
jb .Ltail_squeeze_avx512
|
|
|
|
mov (%r9),%r8
|
|
lea 8(%r9),%r9
|
|
mov %r8,(%rsi)
|
|
lea 8(%rsi),%rsi
|
|
sub $8,%rdx # len -= 8
|
|
jz .Ldone_squeeze_avx512
|
|
|
|
sub $1,%rax # bsz--
|
|
jnz .Loop_squeeze_avx512
|
|
|
|
#vpermq %zmm16,%zmm16,%zmm15
|
|
#vpermq %zmm15,%zmm16,%zmm14
|
|
#vpermq %zmm15,%zmm15,%zmm13
|
|
|
|
call __KeccakF1600
|
|
|
|
vmovdqu64 %zmm0,40*0-96(%rdi){%k6}
|
|
vmovdqu64 %zmm1,40*1-96(%rdi){%k6}
|
|
vmovdqu64 %zmm2,40*2-96(%rdi){%k6}
|
|
vmovdqu64 %zmm3,40*3-96(%rdi){%k6}
|
|
vmovdqu64 %zmm4,40*4-96(%rdi){%k6}
|
|
|
|
lea -96(%rdi),%r9
|
|
mov %rcx,%rax
|
|
jmp .Loop_squeeze_avx512
|
|
|
|
.Ltail_squeeze_avx512:
|
|
mov %rsi,%rdi
|
|
mov %r9,%rsi
|
|
mov %rdx,%rcx
|
|
.byte 0xf3,0xa4 # rep movsb
|
|
|
|
.Ldone_squeeze_avx512:
|
|
vzeroupper
|
|
|
|
lea (%r11),%rsp
|
|
ret
|
|
.size SHA3_squeeze,.-SHA3_squeeze
|
|
|
|
.section .rodata
|
|
.align 64
|
|
theta_perm:
|
|
.quad 0, 1, 2, 3, 4, 5, 6, 7 # [not used]
|
|
.quad 4, 0, 1, 2, 3, 5, 6, 7
|
|
.quad 3, 4, 0, 1, 2, 5, 6, 7
|
|
.quad 2, 3, 4, 0, 1, 5, 6, 7
|
|
.quad 1, 2, 3, 4, 0, 5, 6, 7
|
|
|
|
rhotates1:
|
|
.quad 0, 44, 43, 21, 14, 0, 0, 0 # [0][0] [1][1] [2][2] [3][3] [4][4]
|
|
.quad 18, 1, 6, 25, 8, 0, 0, 0 # [4][0] [0][1] [1][2] [2][3] [3][4]
|
|
.quad 41, 2, 62, 55, 39, 0, 0, 0 # [3][0] [4][1] [0][2] [1][3] [2][4]
|
|
.quad 3, 45, 61, 28, 20, 0, 0, 0 # [2][0] [3][1] [4][2] [0][3] [1][4]
|
|
.quad 36, 10, 15, 56, 27, 0, 0, 0 # [1][0] [2][1] [3][2] [4][3] [0][4]
|
|
|
|
rhotates0:
|
|
.quad 0, 1, 62, 28, 27, 0, 0, 0
|
|
.quad 36, 44, 6, 55, 20, 0, 0, 0
|
|
.quad 3, 10, 43, 25, 39, 0, 0, 0
|
|
.quad 41, 45, 15, 21, 8, 0, 0, 0
|
|
.quad 18, 2, 61, 56, 14, 0, 0, 0
|
|
|
|
pi0_perm:
|
|
.quad 0, 3, 1, 4, 2, 5, 6, 7
|
|
.quad 1, 4, 2, 0, 3, 5, 6, 7
|
|
.quad 2, 0, 3, 1, 4, 5, 6, 7
|
|
.quad 3, 1, 4, 2, 0, 5, 6, 7
|
|
.quad 4, 2, 0, 3, 1, 5, 6, 7
|
|
|
|
|
|
iotas:
|
|
.quad 0x0000000000000001
|
|
.quad 0x0000000000008082
|
|
.quad 0x800000000000808a
|
|
.quad 0x8000000080008000
|
|
.quad 0x000000000000808b
|
|
.quad 0x0000000080000001
|
|
.quad 0x8000000080008081
|
|
.quad 0x8000000000008009
|
|
.quad 0x000000000000008a
|
|
.quad 0x0000000000000088
|
|
.quad 0x0000000080008009
|
|
.quad 0x000000008000000a
|
|
.quad 0x000000008000808b
|
|
.quad 0x800000000000008b
|
|
.quad 0x8000000000008089
|
|
.quad 0x8000000000008003
|
|
.quad 0x8000000000008002
|
|
.quad 0x8000000000000080
|
|
.quad 0x000000000000800a
|
|
.quad 0x800000008000000a
|
|
.quad 0x8000000080008081
|
|
.quad 0x8000000000008080
|
|
.quad 0x0000000080000001
|
|
.quad 0x8000000080008008
|
|
|
|
.asciz "Keccak-1600 absorb and squeeze for AVX-512F, CRYPTOGAMS by <appro@openssl.org>"
|