2018-11-20 17:30:48 +01:00
/* SPDX-License-Identifier: GPL-2.0+ */
/ *
2018-12-04 22:20:03 -08:00
* ChaCha 2 5 6 - b i t c i p h e r a l g o r i t h m , x64 A V X - 5 1 2 V L f u n c t i o n s
2018-11-20 17:30:48 +01:00
*
* Copyright ( C ) 2 0 1 8 M a r t i n W i l l i
* /
# include < l i n u x / l i n k a g e . h >
2018-11-20 17:30:49 +01:00
.section .rodata .cst32 .CTR2BL , " aM" , @progbits, 32
.align 32
CTR2BL : .octa 0x00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
.octa 0x00000000000000000000000000000001
2018-11-20 17:30:50 +01:00
.section .rodata .cst32 .CTR4BL , " aM" , @progbits, 32
.align 32
CTR4BL : .octa 0x00000000 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2
.octa 0x00000000000000000000000000000003
2018-11-20 17:30:48 +01:00
.section .rodata .cst32 .CTR8BL , " aM" , @progbits, 32
.align 32
CTR8BL : .octa 0x00000003 0 0 0 0 0 0 0 2 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0
.octa 0x00000007000000060000000500000004
.text
2018-12-04 22:20:03 -08:00
ENTRY( c h a c h a _ 2 b l o c k _ x o r _ a v x51 2 v l )
2018-11-20 17:30:49 +01:00
# % rdi : Input s t a t e m a t r i x , s
# % rsi : up t o 2 d a t a b l o c k s o u t p u t , o
# % rdx : up t o 2 d a t a b l o c k s i n p u t , i
# % rcx : input/ o u t p u t l e n g t h i n b y t e s
2018-12-04 22:20:03 -08:00
# % r8d : nrounds
2018-11-20 17:30:49 +01:00
2018-12-04 22:20:03 -08:00
# This f u n c t i o n e n c r y p t s t w o C h a C h a b l o c k s b y l o a d i n g t h e s t a t e
2018-11-20 17:30:49 +01:00
# matrix t w i c e a c r o s s f o u r A V X r e g i s t e r s . I t p e r f o r m s m a t r i x o p e r a t i o n s
# on f o u r w o r d s i n e a c h m a t r i x i n p a r a l l e l , b u t r e q u i r e s s h u f f l i n g t o
# rearrange t h e w o r d s a f t e r e a c h r o u n d .
vzeroupper
# x0 . . 3 [ 0 - 2 ] = s0 . . 3
vbroadcasti1 2 8 0 x00 ( % r d i ) ,% y m m 0
vbroadcasti1 2 8 0 x10 ( % r d i ) ,% y m m 1
vbroadcasti1 2 8 0 x20 ( % r d i ) ,% y m m 2
vbroadcasti1 2 8 0 x30 ( % r d i ) ,% y m m 3
vpaddd C T R 2 B L ( % r i p ) ,% y m m 3 ,% y m m 3
vmovdqa % y m m 0 ,% y m m 8
vmovdqa % y m m 1 ,% y m m 9
vmovdqa % y m m 2 ,% y m m 1 0
vmovdqa % y m m 3 ,% y m m 1 1
.Ldoubleround :
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 1 6 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 1 6 ,% y m m 3 ,% y m m 3
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 1 2 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 1 2 ,% y m m 1 ,% y m m 1
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 8 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 8 ,% y m m 3 ,% y m m 3
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 7 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 7 ,% y m m 1 ,% y m m 1
# x1 = s h u f f l e 3 2 ( x1 , M A S K ( 0 , 3 , 2 , 1 ) )
vpshufd $ 0 x39 ,% y m m 1 ,% y m m 1
# x2 = s h u f f l e 3 2 ( x2 , M A S K ( 1 , 0 , 3 , 2 ) )
vpshufd $ 0 x4 e ,% y m m 2 ,% y m m 2
# x3 = s h u f f l e 3 2 ( x3 , M A S K ( 2 , 1 , 0 , 3 ) )
vpshufd $ 0 x93 ,% y m m 3 ,% y m m 3
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 1 6 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 1 6 ,% y m m 3 ,% y m m 3
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 1 2 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 1 2 ,% y m m 1 ,% y m m 1
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 8 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 8 ,% y m m 3 ,% y m m 3
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 7 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 7 ,% y m m 1 ,% y m m 1
# x1 = s h u f f l e 3 2 ( x1 , M A S K ( 2 , 1 , 0 , 3 ) )
vpshufd $ 0 x93 ,% y m m 1 ,% y m m 1
# x2 = s h u f f l e 3 2 ( x2 , M A S K ( 1 , 0 , 3 , 2 ) )
vpshufd $ 0 x4 e ,% y m m 2 ,% y m m 2
# x3 = s h u f f l e 3 2 ( x3 , M A S K ( 0 , 3 , 2 , 1 ) )
vpshufd $ 0 x39 ,% y m m 3 ,% y m m 3
2018-12-04 22:20:03 -08:00
sub $ 2 ,% r8 d
2018-11-20 17:30:49 +01:00
jnz . L d o u b l e r o u n d
# o0 = i 0 ^ ( x0 + s0 )
vpaddd % y m m 8 ,% y m m 0 ,% y m m 7
cmp $ 0 x10 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x00 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x00 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 7 ,% x m m 0
# o1 = i 1 ^ ( x1 + s1 )
vpaddd % y m m 9 ,% y m m 1 ,% y m m 7
cmp $ 0 x20 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x10 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x10 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 7 ,% x m m 1
# o2 = i 2 ^ ( x2 + s2 )
vpaddd % y m m 1 0 ,% y m m 2 ,% y m m 7
cmp $ 0 x30 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x20 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x20 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 7 ,% x m m 2
# o3 = i 3 ^ ( x3 + s3 )
vpaddd % y m m 1 1 ,% y m m 3 ,% y m m 7
cmp $ 0 x40 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x30 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x30 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 7 ,% x m m 3
# xor a n d w r i t e s e c o n d b l o c k
vmovdqa % x m m 0 ,% x m m 7
cmp $ 0 x50 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x40 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x40 ( % r s i )
vmovdqa % x m m 1 ,% x m m 7
cmp $ 0 x60 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x50 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x50 ( % r s i )
vmovdqa % x m m 2 ,% x m m 7
cmp $ 0 x70 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x60 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x60 ( % r s i )
vmovdqa % x m m 3 ,% x m m 7
cmp $ 0 x80 ,% r c x
jl . L x o r p a r t 2
vpxord 0 x70 ( % r d x ) ,% x m m 7 ,% x m m 6
vmovdqu % x m m 6 ,0 x70 ( % r s i )
.Ldone2 :
vzeroupper
ret
.Lxorpart2 :
# xor r e m a i n i n g b y t e s f r o m p a r t i a l r e g i s t e r i n t o o u t p u t
mov % r c x ,% r a x
and $ 0 x f ,% r c x
jz . L d o n e 8
mov % r a x ,% r9
and $ ~ 0 x f ,% r9
mov $ 1 ,% r a x
shld % c l ,% r a x ,% r a x
sub $ 1 ,% r a x
kmovq % r a x ,% k 1
vmovdqu8 ( % r d x ,% r9 ) ,% x m m 1 { % k 1 } { z }
vpxord % x m m 7 ,% x m m 1 ,% x m m 1
vmovdqu8 % x m m 1 ,( % r s i ,% r9 ) { % k 1 }
jmp . L d o n e 2
2018-12-04 22:20:03 -08:00
ENDPROC( c h a c h a _ 2 b l o c k _ x o r _ a v x51 2 v l )
2018-11-20 17:30:49 +01:00
2018-12-04 22:20:03 -08:00
ENTRY( c h a c h a _ 4 b l o c k _ x o r _ a v x51 2 v l )
2018-11-20 17:30:50 +01:00
# % rdi : Input s t a t e m a t r i x , s
# % rsi : up t o 4 d a t a b l o c k s o u t p u t , o
# % rdx : up t o 4 d a t a b l o c k s i n p u t , i
# % rcx : input/ o u t p u t l e n g t h i n b y t e s
2018-12-04 22:20:03 -08:00
# % r8d : nrounds
2018-11-20 17:30:50 +01:00
2018-12-04 22:20:03 -08:00
# This f u n c t i o n e n c r y p t s f o u r C h a C h a b l o c k s b y l o a d i n g t h e s t a t e
2018-11-20 17:30:50 +01:00
# matrix f o u r t i m e s a c r o s s e i g h t A V X r e g i s t e r s . I t p e r f o r m s m a t r i x
# operations o n f o u r w o r d s i n t w o m a t r i c e s i n p a r a l l e l , s e q u e n t i a l l y
# to t h e o p e r a t i o n s o n t h e f o u r w o r d s o f t h e o t h e r t w o m a t r i c e s . T h e
# required w o r d s h u f f l i n g h a s a r a t h e r h i g h l a t e n c y , w e c a n d o t h e
# arithmetic o n t w o m a t r i x - p a i r s w i t h o u t m u c h s l o w d o w n .
vzeroupper
# x0 . . 3 [ 0 - 4 ] = s0 . . 3
vbroadcasti1 2 8 0 x00 ( % r d i ) ,% y m m 0
vbroadcasti1 2 8 0 x10 ( % r d i ) ,% y m m 1
vbroadcasti1 2 8 0 x20 ( % r d i ) ,% y m m 2
vbroadcasti1 2 8 0 x30 ( % r d i ) ,% y m m 3
vmovdqa % y m m 0 ,% y m m 4
vmovdqa % y m m 1 ,% y m m 5
vmovdqa % y m m 2 ,% y m m 6
vmovdqa % y m m 3 ,% y m m 7
vpaddd C T R 2 B L ( % r i p ) ,% y m m 3 ,% y m m 3
vpaddd C T R 4 B L ( % r i p ) ,% y m m 7 ,% y m m 7
vmovdqa % y m m 0 ,% y m m 1 1
vmovdqa % y m m 1 ,% y m m 1 2
vmovdqa % y m m 2 ,% y m m 1 3
vmovdqa % y m m 3 ,% y m m 1 4
vmovdqa % y m m 7 ,% y m m 1 5
.Ldoubleround4 :
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 1 6 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 1 6 ,% y m m 3 ,% y m m 3
vpaddd % y m m 5 ,% y m m 4 ,% y m m 4
vpxord % y m m 4 ,% y m m 7 ,% y m m 7
vprold $ 1 6 ,% y m m 7 ,% y m m 7
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 1 2 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 1 2 ,% y m m 1 ,% y m m 1
vpaddd % y m m 7 ,% y m m 6 ,% y m m 6
vpxord % y m m 6 ,% y m m 5 ,% y m m 5
vprold $ 1 2 ,% y m m 5 ,% y m m 5
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 8 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 8 ,% y m m 3 ,% y m m 3
vpaddd % y m m 5 ,% y m m 4 ,% y m m 4
vpxord % y m m 4 ,% y m m 7 ,% y m m 7
vprold $ 8 ,% y m m 7 ,% y m m 7
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 7 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 7 ,% y m m 1 ,% y m m 1
vpaddd % y m m 7 ,% y m m 6 ,% y m m 6
vpxord % y m m 6 ,% y m m 5 ,% y m m 5
vprold $ 7 ,% y m m 5 ,% y m m 5
# x1 = s h u f f l e 3 2 ( x1 , M A S K ( 0 , 3 , 2 , 1 ) )
vpshufd $ 0 x39 ,% y m m 1 ,% y m m 1
vpshufd $ 0 x39 ,% y m m 5 ,% y m m 5
# x2 = s h u f f l e 3 2 ( x2 , M A S K ( 1 , 0 , 3 , 2 ) )
vpshufd $ 0 x4 e ,% y m m 2 ,% y m m 2
vpshufd $ 0 x4 e ,% y m m 6 ,% y m m 6
# x3 = s h u f f l e 3 2 ( x3 , M A S K ( 2 , 1 , 0 , 3 ) )
vpshufd $ 0 x93 ,% y m m 3 ,% y m m 3
vpshufd $ 0 x93 ,% y m m 7 ,% y m m 7
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 1 6 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 1 6 ,% y m m 3 ,% y m m 3
vpaddd % y m m 5 ,% y m m 4 ,% y m m 4
vpxord % y m m 4 ,% y m m 7 ,% y m m 7
vprold $ 1 6 ,% y m m 7 ,% y m m 7
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 1 2 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 1 2 ,% y m m 1 ,% y m m 1
vpaddd % y m m 7 ,% y m m 6 ,% y m m 6
vpxord % y m m 6 ,% y m m 5 ,% y m m 5
vprold $ 1 2 ,% y m m 5 ,% y m m 5
# x0 + = x1 , x3 = r o t l 3 2 ( x3 ^ x0 , 8 )
vpaddd % y m m 1 ,% y m m 0 ,% y m m 0
vpxord % y m m 0 ,% y m m 3 ,% y m m 3
vprold $ 8 ,% y m m 3 ,% y m m 3
vpaddd % y m m 5 ,% y m m 4 ,% y m m 4
vpxord % y m m 4 ,% y m m 7 ,% y m m 7
vprold $ 8 ,% y m m 7 ,% y m m 7
# x2 + = x3 , x1 = r o t l 3 2 ( x1 ^ x2 , 7 )
vpaddd % y m m 3 ,% y m m 2 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 ,% y m m 1
vprold $ 7 ,% y m m 1 ,% y m m 1
vpaddd % y m m 7 ,% y m m 6 ,% y m m 6
vpxord % y m m 6 ,% y m m 5 ,% y m m 5
vprold $ 7 ,% y m m 5 ,% y m m 5
# x1 = s h u f f l e 3 2 ( x1 , M A S K ( 2 , 1 , 0 , 3 ) )
vpshufd $ 0 x93 ,% y m m 1 ,% y m m 1
vpshufd $ 0 x93 ,% y m m 5 ,% y m m 5
# x2 = s h u f f l e 3 2 ( x2 , M A S K ( 1 , 0 , 3 , 2 ) )
vpshufd $ 0 x4 e ,% y m m 2 ,% y m m 2
vpshufd $ 0 x4 e ,% y m m 6 ,% y m m 6
# x3 = s h u f f l e 3 2 ( x3 , M A S K ( 0 , 3 , 2 , 1 ) )
vpshufd $ 0 x39 ,% y m m 3 ,% y m m 3
vpshufd $ 0 x39 ,% y m m 7 ,% y m m 7
2018-12-04 22:20:03 -08:00
sub $ 2 ,% r8 d
2018-11-20 17:30:50 +01:00
jnz . L d o u b l e r o u n d4
# o0 = i 0 ^ ( x0 + s0 ) , f i r s t b l o c k
vpaddd % y m m 1 1 ,% y m m 0 ,% y m m 1 0
cmp $ 0 x10 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x00 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x00 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 0
# o1 = i 1 ^ ( x1 + s1 ) , f i r s t b l o c k
vpaddd % y m m 1 2 ,% y m m 1 ,% y m m 1 0
cmp $ 0 x20 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x10 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x10 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 1
# o2 = i 2 ^ ( x2 + s2 ) , f i r s t b l o c k
vpaddd % y m m 1 3 ,% y m m 2 ,% y m m 1 0
cmp $ 0 x30 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x20 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x20 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 2
# o3 = i 3 ^ ( x3 + s3 ) , f i r s t b l o c k
vpaddd % y m m 1 4 ,% y m m 3 ,% y m m 1 0
cmp $ 0 x40 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x30 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x30 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 3
# xor a n d w r i t e s e c o n d b l o c k
vmovdqa % x m m 0 ,% x m m 1 0
cmp $ 0 x50 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x40 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x40 ( % r s i )
vmovdqa % x m m 1 ,% x m m 1 0
cmp $ 0 x60 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x50 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x50 ( % r s i )
vmovdqa % x m m 2 ,% x m m 1 0
cmp $ 0 x70 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x60 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x60 ( % r s i )
vmovdqa % x m m 3 ,% x m m 1 0
cmp $ 0 x80 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x70 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x70 ( % r s i )
# o0 = i 0 ^ ( x0 + s0 ) , t h i r d b l o c k
vpaddd % y m m 1 1 ,% y m m 4 ,% y m m 1 0
cmp $ 0 x90 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x80 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x80 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 4
# o1 = i 1 ^ ( x1 + s1 ) , t h i r d b l o c k
vpaddd % y m m 1 2 ,% y m m 5 ,% y m m 1 0
cmp $ 0 x a0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x90 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x90 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 5
# o2 = i 2 ^ ( x2 + s2 ) , t h i r d b l o c k
vpaddd % y m m 1 3 ,% y m m 6 ,% y m m 1 0
cmp $ 0 x b0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x a0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x a0 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 6
# o3 = i 3 ^ ( x3 + s3 ) , t h i r d b l o c k
vpaddd % y m m 1 5 ,% y m m 7 ,% y m m 1 0
cmp $ 0 x c0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x b0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x b0 ( % r s i )
vextracti1 2 8 $ 1 ,% y m m 1 0 ,% x m m 7
# xor a n d w r i t e f o u r t h b l o c k
vmovdqa % x m m 4 ,% x m m 1 0
cmp $ 0 x d0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x c0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x c0 ( % r s i )
vmovdqa % x m m 5 ,% x m m 1 0
cmp $ 0 x e 0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x d0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x d0 ( % r s i )
vmovdqa % x m m 6 ,% x m m 1 0
cmp $ 0 x f0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x e 0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x e 0 ( % r s i )
vmovdqa % x m m 7 ,% x m m 1 0
cmp $ 0 x10 0 ,% r c x
jl . L x o r p a r t 4
vpxord 0 x f0 ( % r d x ) ,% x m m 1 0 ,% x m m 9
vmovdqu % x m m 9 ,0 x f0 ( % r s i )
.Ldone4 :
vzeroupper
ret
.Lxorpart4 :
# xor r e m a i n i n g b y t e s f r o m p a r t i a l r e g i s t e r i n t o o u t p u t
mov % r c x ,% r a x
and $ 0 x f ,% r c x
jz . L d o n e 8
mov % r a x ,% r9
and $ ~ 0 x f ,% r9
mov $ 1 ,% r a x
shld % c l ,% r a x ,% r a x
sub $ 1 ,% r a x
kmovq % r a x ,% k 1
vmovdqu8 ( % r d x ,% r9 ) ,% x m m 1 { % k 1 } { z }
vpxord % x m m 1 0 ,% x m m 1 ,% x m m 1
vmovdqu8 % x m m 1 ,( % r s i ,% r9 ) { % k 1 }
jmp . L d o n e 4
2018-12-04 22:20:03 -08:00
ENDPROC( c h a c h a _ 4 b l o c k _ x o r _ a v x51 2 v l )
2018-11-20 17:30:50 +01:00
2018-12-04 22:20:03 -08:00
ENTRY( c h a c h a _ 8 b l o c k _ x o r _ a v x51 2 v l )
2018-11-20 17:30:48 +01:00
# % rdi : Input s t a t e m a t r i x , s
# % rsi : up t o 8 d a t a b l o c k s o u t p u t , o
# % rdx : up t o 8 d a t a b l o c k s i n p u t , i
# % rcx : input/ o u t p u t l e n g t h i n b y t e s
2018-12-04 22:20:03 -08:00
# % r8d : nrounds
2018-11-20 17:30:48 +01:00
2018-12-04 22:20:03 -08:00
# This f u n c t i o n e n c r y p t s e i g h t c o n s e c u t i v e C h a C h a b l o c k s b y l o a d i n g
2018-11-20 17:30:48 +01:00
# the s t a t e m a t r i x i n A V X r e g i s t e r s e i g h t t i m e s . C o m p a r e d t o A V X 2 , t h i s
# mostly b e n e f i t s f r o m t h e n e w r o t a t e i n s t r u c t i o n s i n V L a n d t h e
# additional r e g i s t e r s .
vzeroupper
# x0 . . 1 5 [ 0 - 7 ] = s [ 0 . . 1 5 ]
vpbroadcastd 0 x00 ( % r d i ) ,% y m m 0
vpbroadcastd 0 x04 ( % r d i ) ,% y m m 1
vpbroadcastd 0 x08 ( % r d i ) ,% y m m 2
vpbroadcastd 0 x0 c ( % r d i ) ,% y m m 3
vpbroadcastd 0 x10 ( % r d i ) ,% y m m 4
vpbroadcastd 0 x14 ( % r d i ) ,% y m m 5
vpbroadcastd 0 x18 ( % r d i ) ,% y m m 6
vpbroadcastd 0 x1 c ( % r d i ) ,% y m m 7
vpbroadcastd 0 x20 ( % r d i ) ,% y m m 8
vpbroadcastd 0 x24 ( % r d i ) ,% y m m 9
vpbroadcastd 0 x28 ( % r d i ) ,% y m m 1 0
vpbroadcastd 0 x2 c ( % r d i ) ,% y m m 1 1
vpbroadcastd 0 x30 ( % r d i ) ,% y m m 1 2
vpbroadcastd 0 x34 ( % r d i ) ,% y m m 1 3
vpbroadcastd 0 x38 ( % r d i ) ,% y m m 1 4
vpbroadcastd 0 x3 c ( % r d i ) ,% y m m 1 5
# x1 2 + = c o u n t e r v a l u e s 0 - 3
vpaddd C T R 8 B L ( % r i p ) ,% y m m 1 2 ,% y m m 1 2
vmovdqa6 4 % y m m 0 ,% y m m 1 6
vmovdqa6 4 % y m m 1 ,% y m m 1 7
vmovdqa6 4 % y m m 2 ,% y m m 1 8
vmovdqa6 4 % y m m 3 ,% y m m 1 9
vmovdqa6 4 % y m m 4 ,% y m m 2 0
vmovdqa6 4 % y m m 5 ,% y m m 2 1
vmovdqa6 4 % y m m 6 ,% y m m 2 2
vmovdqa6 4 % y m m 7 ,% y m m 2 3
vmovdqa6 4 % y m m 8 ,% y m m 2 4
vmovdqa6 4 % y m m 9 ,% y m m 2 5
vmovdqa6 4 % y m m 1 0 ,% y m m 2 6
vmovdqa6 4 % y m m 1 1 ,% y m m 2 7
vmovdqa6 4 % y m m 1 2 ,% y m m 2 8
vmovdqa6 4 % y m m 1 3 ,% y m m 2 9
vmovdqa6 4 % y m m 1 4 ,% y m m 3 0
vmovdqa6 4 % y m m 1 5 ,% y m m 3 1
.Ldoubleround8 :
# x0 + = x4 , x12 = r o t l 3 2 ( x12 ^ x0 , 1 6 )
vpaddd % y m m 0 ,% y m m 4 ,% y m m 0
vpxord % y m m 0 ,% y m m 1 2 ,% y m m 1 2
vprold $ 1 6 ,% y m m 1 2 ,% y m m 1 2
# x1 + = x5 , x13 = r o t l 3 2 ( x13 ^ x1 , 1 6 )
vpaddd % y m m 1 ,% y m m 5 ,% y m m 1
vpxord % y m m 1 ,% y m m 1 3 ,% y m m 1 3
vprold $ 1 6 ,% y m m 1 3 ,% y m m 1 3
# x2 + = x6 , x14 = r o t l 3 2 ( x14 ^ x2 , 1 6 )
vpaddd % y m m 2 ,% y m m 6 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 4 ,% y m m 1 4
vprold $ 1 6 ,% y m m 1 4 ,% y m m 1 4
# x3 + = x7 , x15 = r o t l 3 2 ( x15 ^ x3 , 1 6 )
vpaddd % y m m 3 ,% y m m 7 ,% y m m 3
vpxord % y m m 3 ,% y m m 1 5 ,% y m m 1 5
vprold $ 1 6 ,% y m m 1 5 ,% y m m 1 5
# x8 + = x12 , x4 = r o t l 3 2 ( x4 ^ x8 , 1 2 )
vpaddd % y m m 1 2 ,% y m m 8 ,% y m m 8
vpxord % y m m 8 ,% y m m 4 ,% y m m 4
vprold $ 1 2 ,% y m m 4 ,% y m m 4
# x9 + = x13 , x5 = r o t l 3 2 ( x5 ^ x9 , 1 2 )
vpaddd % y m m 1 3 ,% y m m 9 ,% y m m 9
vpxord % y m m 9 ,% y m m 5 ,% y m m 5
vprold $ 1 2 ,% y m m 5 ,% y m m 5
# x1 0 + = x14 , x6 = r o t l 3 2 ( x6 ^ x10 , 1 2 )
vpaddd % y m m 1 4 ,% y m m 1 0 ,% y m m 1 0
vpxord % y m m 1 0 ,% y m m 6 ,% y m m 6
vprold $ 1 2 ,% y m m 6 ,% y m m 6
# x1 1 + = x15 , x7 = r o t l 3 2 ( x7 ^ x11 , 1 2 )
vpaddd % y m m 1 5 ,% y m m 1 1 ,% y m m 1 1
vpxord % y m m 1 1 ,% y m m 7 ,% y m m 7
vprold $ 1 2 ,% y m m 7 ,% y m m 7
# x0 + = x4 , x12 = r o t l 3 2 ( x12 ^ x0 , 8 )
vpaddd % y m m 0 ,% y m m 4 ,% y m m 0
vpxord % y m m 0 ,% y m m 1 2 ,% y m m 1 2
vprold $ 8 ,% y m m 1 2 ,% y m m 1 2
# x1 + = x5 , x13 = r o t l 3 2 ( x13 ^ x1 , 8 )
vpaddd % y m m 1 ,% y m m 5 ,% y m m 1
vpxord % y m m 1 ,% y m m 1 3 ,% y m m 1 3
vprold $ 8 ,% y m m 1 3 ,% y m m 1 3
# x2 + = x6 , x14 = r o t l 3 2 ( x14 ^ x2 , 8 )
vpaddd % y m m 2 ,% y m m 6 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 4 ,% y m m 1 4
vprold $ 8 ,% y m m 1 4 ,% y m m 1 4
# x3 + = x7 , x15 = r o t l 3 2 ( x15 ^ x3 , 8 )
vpaddd % y m m 3 ,% y m m 7 ,% y m m 3
vpxord % y m m 3 ,% y m m 1 5 ,% y m m 1 5
vprold $ 8 ,% y m m 1 5 ,% y m m 1 5
# x8 + = x12 , x4 = r o t l 3 2 ( x4 ^ x8 , 7 )
vpaddd % y m m 1 2 ,% y m m 8 ,% y m m 8
vpxord % y m m 8 ,% y m m 4 ,% y m m 4
vprold $ 7 ,% y m m 4 ,% y m m 4
# x9 + = x13 , x5 = r o t l 3 2 ( x5 ^ x9 , 7 )
vpaddd % y m m 1 3 ,% y m m 9 ,% y m m 9
vpxord % y m m 9 ,% y m m 5 ,% y m m 5
vprold $ 7 ,% y m m 5 ,% y m m 5
# x1 0 + = x14 , x6 = r o t l 3 2 ( x6 ^ x10 , 7 )
vpaddd % y m m 1 4 ,% y m m 1 0 ,% y m m 1 0
vpxord % y m m 1 0 ,% y m m 6 ,% y m m 6
vprold $ 7 ,% y m m 6 ,% y m m 6
# x1 1 + = x15 , x7 = r o t l 3 2 ( x7 ^ x11 , 7 )
vpaddd % y m m 1 5 ,% y m m 1 1 ,% y m m 1 1
vpxord % y m m 1 1 ,% y m m 7 ,% y m m 7
vprold $ 7 ,% y m m 7 ,% y m m 7
# x0 + = x5 , x15 = r o t l 3 2 ( x15 ^ x0 , 1 6 )
vpaddd % y m m 0 ,% y m m 5 ,% y m m 0
vpxord % y m m 0 ,% y m m 1 5 ,% y m m 1 5
vprold $ 1 6 ,% y m m 1 5 ,% y m m 1 5
# x1 + = x6 , x12 = r o t l 3 2 ( x12 ^ x1 , 1 6 )
vpaddd % y m m 1 ,% y m m 6 ,% y m m 1
vpxord % y m m 1 ,% y m m 1 2 ,% y m m 1 2
vprold $ 1 6 ,% y m m 1 2 ,% y m m 1 2
# x2 + = x7 , x13 = r o t l 3 2 ( x13 ^ x2 , 1 6 )
vpaddd % y m m 2 ,% y m m 7 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 3 ,% y m m 1 3
vprold $ 1 6 ,% y m m 1 3 ,% y m m 1 3
# x3 + = x4 , x14 = r o t l 3 2 ( x14 ^ x3 , 1 6 )
vpaddd % y m m 3 ,% y m m 4 ,% y m m 3
vpxord % y m m 3 ,% y m m 1 4 ,% y m m 1 4
vprold $ 1 6 ,% y m m 1 4 ,% y m m 1 4
# x1 0 + = x15 , x5 = r o t l 3 2 ( x5 ^ x10 , 1 2 )
vpaddd % y m m 1 5 ,% y m m 1 0 ,% y m m 1 0
vpxord % y m m 1 0 ,% y m m 5 ,% y m m 5
vprold $ 1 2 ,% y m m 5 ,% y m m 5
# x1 1 + = x12 , x6 = r o t l 3 2 ( x6 ^ x11 , 1 2 )
vpaddd % y m m 1 2 ,% y m m 1 1 ,% y m m 1 1
vpxord % y m m 1 1 ,% y m m 6 ,% y m m 6
vprold $ 1 2 ,% y m m 6 ,% y m m 6
# x8 + = x13 , x7 = r o t l 3 2 ( x7 ^ x8 , 1 2 )
vpaddd % y m m 1 3 ,% y m m 8 ,% y m m 8
vpxord % y m m 8 ,% y m m 7 ,% y m m 7
vprold $ 1 2 ,% y m m 7 ,% y m m 7
# x9 + = x14 , x4 = r o t l 3 2 ( x4 ^ x9 , 1 2 )
vpaddd % y m m 1 4 ,% y m m 9 ,% y m m 9
vpxord % y m m 9 ,% y m m 4 ,% y m m 4
vprold $ 1 2 ,% y m m 4 ,% y m m 4
# x0 + = x5 , x15 = r o t l 3 2 ( x15 ^ x0 , 8 )
vpaddd % y m m 0 ,% y m m 5 ,% y m m 0
vpxord % y m m 0 ,% y m m 1 5 ,% y m m 1 5
vprold $ 8 ,% y m m 1 5 ,% y m m 1 5
# x1 + = x6 , x12 = r o t l 3 2 ( x12 ^ x1 , 8 )
vpaddd % y m m 1 ,% y m m 6 ,% y m m 1
vpxord % y m m 1 ,% y m m 1 2 ,% y m m 1 2
vprold $ 8 ,% y m m 1 2 ,% y m m 1 2
# x2 + = x7 , x13 = r o t l 3 2 ( x13 ^ x2 , 8 )
vpaddd % y m m 2 ,% y m m 7 ,% y m m 2
vpxord % y m m 2 ,% y m m 1 3 ,% y m m 1 3
vprold $ 8 ,% y m m 1 3 ,% y m m 1 3
# x3 + = x4 , x14 = r o t l 3 2 ( x14 ^ x3 , 8 )
vpaddd % y m m 3 ,% y m m 4 ,% y m m 3
vpxord % y m m 3 ,% y m m 1 4 ,% y m m 1 4
vprold $ 8 ,% y m m 1 4 ,% y m m 1 4
# x1 0 + = x15 , x5 = r o t l 3 2 ( x5 ^ x10 , 7 )
vpaddd % y m m 1 5 ,% y m m 1 0 ,% y m m 1 0
vpxord % y m m 1 0 ,% y m m 5 ,% y m m 5
vprold $ 7 ,% y m m 5 ,% y m m 5
# x1 1 + = x12 , x6 = r o t l 3 2 ( x6 ^ x11 , 7 )
vpaddd % y m m 1 2 ,% y m m 1 1 ,% y m m 1 1
vpxord % y m m 1 1 ,% y m m 6 ,% y m m 6
vprold $ 7 ,% y m m 6 ,% y m m 6
# x8 + = x13 , x7 = r o t l 3 2 ( x7 ^ x8 , 7 )
vpaddd % y m m 1 3 ,% y m m 8 ,% y m m 8
vpxord % y m m 8 ,% y m m 7 ,% y m m 7
vprold $ 7 ,% y m m 7 ,% y m m 7
# x9 + = x14 , x4 = r o t l 3 2 ( x4 ^ x9 , 7 )
vpaddd % y m m 1 4 ,% y m m 9 ,% y m m 9
vpxord % y m m 9 ,% y m m 4 ,% y m m 4
vprold $ 7 ,% y m m 4 ,% y m m 4
2018-12-04 22:20:03 -08:00
sub $ 2 ,% r8 d
2018-11-20 17:30:48 +01:00
jnz . L d o u b l e r o u n d8
# x0 . . 1 5 [ 0 - 3 ] + = s [ 0 . . 1 5 ]
vpaddd % y m m 1 6 ,% y m m 0 ,% y m m 0
vpaddd % y m m 1 7 ,% y m m 1 ,% y m m 1
vpaddd % y m m 1 8 ,% y m m 2 ,% y m m 2
vpaddd % y m m 1 9 ,% y m m 3 ,% y m m 3
vpaddd % y m m 2 0 ,% y m m 4 ,% y m m 4
vpaddd % y m m 2 1 ,% y m m 5 ,% y m m 5
vpaddd % y m m 2 2 ,% y m m 6 ,% y m m 6
vpaddd % y m m 2 3 ,% y m m 7 ,% y m m 7
vpaddd % y m m 2 4 ,% y m m 8 ,% y m m 8
vpaddd % y m m 2 5 ,% y m m 9 ,% y m m 9
vpaddd % y m m 2 6 ,% y m m 1 0 ,% y m m 1 0
vpaddd % y m m 2 7 ,% y m m 1 1 ,% y m m 1 1
vpaddd % y m m 2 8 ,% y m m 1 2 ,% y m m 1 2
vpaddd % y m m 2 9 ,% y m m 1 3 ,% y m m 1 3
vpaddd % y m m 3 0 ,% y m m 1 4 ,% y m m 1 4
vpaddd % y m m 3 1 ,% y m m 1 5 ,% y m m 1 5
# interleave 3 2 - b i t w o r d s i n s t a t e n , n + 1
vpunpckldq % y m m 1 ,% y m m 0 ,% y m m 1 6
vpunpckhdq % y m m 1 ,% y m m 0 ,% y m m 1 7
vpunpckldq % y m m 3 ,% y m m 2 ,% y m m 1 8
vpunpckhdq % y m m 3 ,% y m m 2 ,% y m m 1 9
vpunpckldq % y m m 5 ,% y m m 4 ,% y m m 2 0
vpunpckhdq % y m m 5 ,% y m m 4 ,% y m m 2 1
vpunpckldq % y m m 7 ,% y m m 6 ,% y m m 2 2
vpunpckhdq % y m m 7 ,% y m m 6 ,% y m m 2 3
vpunpckldq % y m m 9 ,% y m m 8 ,% y m m 2 4
vpunpckhdq % y m m 9 ,% y m m 8 ,% y m m 2 5
vpunpckldq % y m m 1 1 ,% y m m 1 0 ,% y m m 2 6
vpunpckhdq % y m m 1 1 ,% y m m 1 0 ,% y m m 2 7
vpunpckldq % y m m 1 3 ,% y m m 1 2 ,% y m m 2 8
vpunpckhdq % y m m 1 3 ,% y m m 1 2 ,% y m m 2 9
vpunpckldq % y m m 1 5 ,% y m m 1 4 ,% y m m 3 0
vpunpckhdq % y m m 1 5 ,% y m m 1 4 ,% y m m 3 1
# interleave 6 4 - b i t w o r d s i n s t a t e n , n + 2
vpunpcklqdq % y m m 1 8 ,% y m m 1 6 ,% y m m 0
vpunpcklqdq % y m m 1 9 ,% y m m 1 7 ,% y m m 1
vpunpckhqdq % y m m 1 8 ,% y m m 1 6 ,% y m m 2
vpunpckhqdq % y m m 1 9 ,% y m m 1 7 ,% y m m 3
vpunpcklqdq % y m m 2 2 ,% y m m 2 0 ,% y m m 4
vpunpcklqdq % y m m 2 3 ,% y m m 2 1 ,% y m m 5
vpunpckhqdq % y m m 2 2 ,% y m m 2 0 ,% y m m 6
vpunpckhqdq % y m m 2 3 ,% y m m 2 1 ,% y m m 7
vpunpcklqdq % y m m 2 6 ,% y m m 2 4 ,% y m m 8
vpunpcklqdq % y m m 2 7 ,% y m m 2 5 ,% y m m 9
vpunpckhqdq % y m m 2 6 ,% y m m 2 4 ,% y m m 1 0
vpunpckhqdq % y m m 2 7 ,% y m m 2 5 ,% y m m 1 1
vpunpcklqdq % y m m 3 0 ,% y m m 2 8 ,% y m m 1 2
vpunpcklqdq % y m m 3 1 ,% y m m 2 9 ,% y m m 1 3
vpunpckhqdq % y m m 3 0 ,% y m m 2 8 ,% y m m 1 4
vpunpckhqdq % y m m 3 1 ,% y m m 2 9 ,% y m m 1 5
# interleave 1 2 8 - b i t w o r d s i n s t a t e n , n + 4
# xor/ w r i t e f i r s t f o u r b l o c k s
vmovdqa6 4 % y m m 0 ,% y m m 1 6
vperm2 i 1 2 8 $ 0 x20 ,% y m m 4 ,% y m m 0 ,% y m m 0
cmp $ 0 x00 2 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 0 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 0 0 ( % r s i )
vmovdqa6 4 % y m m 1 6 ,% y m m 0
vperm2 i 1 2 8 $ 0 x31 ,% y m m 4 ,% y m m 0 ,% y m m 4
vperm2 i 1 2 8 $ 0 x20 ,% y m m 1 2 ,% y m m 8 ,% y m m 0
cmp $ 0 x00 4 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 2 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 2 0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 1 2 ,% y m m 8 ,% y m m 1 2
vperm2 i 1 2 8 $ 0 x20 ,% y m m 6 ,% y m m 2 ,% y m m 0
cmp $ 0 x00 6 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 4 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 4 0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 6 ,% y m m 2 ,% y m m 6
vperm2 i 1 2 8 $ 0 x20 ,% y m m 1 4 ,% y m m 1 0 ,% y m m 0
cmp $ 0 x00 8 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 6 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 6 0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 1 4 ,% y m m 1 0 ,% y m m 1 4
vperm2 i 1 2 8 $ 0 x20 ,% y m m 5 ,% y m m 1 ,% y m m 0
cmp $ 0 x00 a0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 8 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 8 0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 5 ,% y m m 1 ,% y m m 5
vperm2 i 1 2 8 $ 0 x20 ,% y m m 1 3 ,% y m m 9 ,% y m m 0
cmp $ 0 x00 c0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 a0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 a0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 1 3 ,% y m m 9 ,% y m m 1 3
vperm2 i 1 2 8 $ 0 x20 ,% y m m 7 ,% y m m 3 ,% y m m 0
cmp $ 0 x00 e 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 c0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 c0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 7 ,% y m m 3 ,% y m m 7
vperm2 i 1 2 8 $ 0 x20 ,% y m m 1 5 ,% y m m 1 1 ,% y m m 0
cmp $ 0 x01 0 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x00 e 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x00 e 0 ( % r s i )
vperm2 i 1 2 8 $ 0 x31 ,% y m m 1 5 ,% y m m 1 1 ,% y m m 1 5
# xor r e m a i n i n g b l o c k s , w r i t e t o o u t p u t
vmovdqa6 4 % y m m 4 ,% y m m 0
cmp $ 0 x01 2 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 0 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 0 0 ( % r s i )
vmovdqa6 4 % y m m 1 2 ,% y m m 0
cmp $ 0 x01 4 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 2 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 2 0 ( % r s i )
vmovdqa6 4 % y m m 6 ,% y m m 0
cmp $ 0 x01 6 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 4 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 4 0 ( % r s i )
vmovdqa6 4 % y m m 1 4 ,% y m m 0
cmp $ 0 x01 8 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 6 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 6 0 ( % r s i )
vmovdqa6 4 % y m m 5 ,% y m m 0
cmp $ 0 x01 a0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 8 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 8 0 ( % r s i )
vmovdqa6 4 % y m m 1 3 ,% y m m 0
cmp $ 0 x01 c0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 a0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 a0 ( % r s i )
vmovdqa6 4 % y m m 7 ,% y m m 0
cmp $ 0 x01 e 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 c0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 c0 ( % r s i )
vmovdqa6 4 % y m m 1 5 ,% y m m 0
cmp $ 0 x02 0 0 ,% r c x
jl . L x o r p a r t 8
vpxord 0 x01 e 0 ( % r d x ) ,% y m m 0 ,% y m m 0
vmovdqu6 4 % y m m 0 ,0 x01 e 0 ( % r s i )
.Ldone8 :
vzeroupper
ret
.Lxorpart8 :
# xor r e m a i n i n g b y t e s f r o m p a r t i a l r e g i s t e r i n t o o u t p u t
mov % r c x ,% r a x
and $ 0 x1 f ,% r c x
jz . L d o n e 8
mov % r a x ,% r9
and $ ~ 0 x1 f ,% r9
mov $ 1 ,% r a x
shld % c l ,% r a x ,% r a x
sub $ 1 ,% r a x
kmovq % r a x ,% k 1
vmovdqu8 ( % r d x ,% r9 ) ,% y m m 1 { % k 1 } { z }
vpxord % y m m 0 ,% y m m 1 ,% y m m 1
vmovdqu8 % y m m 1 ,( % r s i ,% r9 ) { % k 1 }
jmp . L d o n e 8
2018-12-04 22:20:03 -08:00
ENDPROC( c h a c h a _ 8 b l o c k _ x o r _ a v x51 2 v l )