2013-04-13 14:46:55 +04:00
/ *
* x8 6 _ 6 4 / A V X 2 a s s e m b l e r o p t i m i z e d v e r s i o n o f S e r p e n t
*
* Copyright © 2 0 1 2 - 2 0 1 3 J u s s i K i v i l i n n a < j u s s i . k i v i l i n n a @mbnet.fi>
*
* Based o n A V X a s s e m b l e r i m p l e m e n t a t i o n o f S e r p e n t b y :
* Copyright © 2 0 1 2 J o h a n n e s G o e t z f r i e d
* < Johannes. G o e t z f r i e d @informatik.stud.uni-erlangen.de>
*
* This p r o g r a m i s f r e e s o f t w a r e ; you can redistribute it and/or modify
* it u n d e r t h e t e r m s o f t h e G N U G e n e r a l P u b l i c L i c e n s e a s p u b l i s h e d b y
* the F r e e S o f t w a r e F o u n d a t i o n ; either version 2 of the License, or
* ( at y o u r o p t i o n ) a n y l a t e r v e r s i o n .
*
* /
# include < l i n u x / l i n k a g e . h >
2016-01-22 01:49:19 +03:00
# include < a s m / f r a m e . h >
2013-04-13 14:46:55 +04:00
# include " g l u e _ h e l p e r - a s m - a v x2 . S "
.file " serpent- a v x2 - a s m _ 6 4 . S "
.data
.align 16
.Lbswap128_mask :
.byte 1 5 , 1 4 , 1 3 , 1 2 , 1 1 , 1 0 , 9 , 8 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0
.Lxts_gf128mul_and_shl1_mask_0 :
.byte 0 x8 7 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 0
.Lxts_gf128mul_and_shl1_mask_1 :
.byte 0 x0 e , 1 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0
.text
# define C T X % r d i
# define R N O T % y m m 0
# define t p % y m m 1
# define R A 1 % y m m 2
# define R A 2 % y m m 3
# define R B 1 % y m m 4
# define R B 2 % y m m 5
# define R C 1 % y m m 6
# define R C 2 % y m m 7
# define R D 1 % y m m 8
# define R D 2 % y m m 9
# define R E 1 % y m m 1 0
# define R E 2 % y m m 1 1
# define R K 0 % y m m 1 2
# define R K 1 % y m m 1 3
# define R K 2 % y m m 1 4
# define R K 3 % y m m 1 5
# define R K 0 x % x m m 1 2
# define R K 1 x % x m m 1 3
# define R K 2 x % x m m 1 4
# define R K 3 x % x m m 1 5
# define S 0 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpor x0 , x3 , t p ; \
vpxor x3 , x0 , x0 ; \
vpxor x2 , x3 , x4 ; \
vpxor R N O T , x4 , x4 ; \
vpxor x1 , t p , x3 ; \
vpand x0 , x1 , x1 ; \
vpxor x4 , x1 , x1 ; \
vpxor x0 , x2 , x2 ;
# define S 0 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x3 , x0 , x0 ; \
vpor x0 , x4 , x4 ; \
vpxor x2 , x0 , x0 ; \
vpand x1 , x2 , x2 ; \
vpxor x2 , x3 , x3 ; \
vpxor R N O T , x1 , x1 ; \
vpxor x4 , x2 , x2 ; \
vpxor x2 , x1 , x1 ;
# define S 1 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x0 , x1 , t p ; \
vpxor x3 , x0 , x0 ; \
vpxor R N O T , x3 , x3 ; \
vpand t p , x1 , x4 ; \
vpor t p , x0 , x0 ; \
vpxor x2 , x3 , x3 ; \
vpxor x3 , x0 , x0 ; \
vpxor x3 , t p , x1 ;
# define S 1 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x4 , x3 , x3 ; \
vpor x4 , x1 , x1 ; \
vpxor x2 , x4 , x4 ; \
vpand x0 , x2 , x2 ; \
vpxor x1 , x2 , x2 ; \
vpor x0 , x1 , x1 ; \
vpxor R N O T , x0 , x0 ; \
vpxor x2 , x0 , x0 ; \
vpxor x1 , x4 , x4 ;
# define S 2 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor R N O T , x3 , x3 ; \
vpxor x0 , x1 , x1 ; \
vpand x2 , x0 , t p ; \
vpxor x3 , t p , t p ; \
vpor x0 , x3 , x3 ; \
vpxor x1 , x2 , x2 ; \
vpxor x1 , x3 , x3 ; \
vpand t p , x1 , x1 ;
# define S 2 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x2 , t p , t p ; \
vpand x3 , x2 , x2 ; \
vpor x1 , x3 , x3 ; \
vpxor R N O T , t p , t p ; \
vpxor t p , x3 , x3 ; \
vpxor t p , x0 , x4 ; \
vpxor x2 , t p , x0 ; \
vpor x2 , x1 , x1 ;
# define S 3 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x3 , x1 , t p ; \
vpor x0 , x3 , x3 ; \
vpand x0 , x1 , x4 ; \
vpxor x2 , x0 , x0 ; \
vpxor t p , x2 , x2 ; \
vpand x3 , t p , x1 ; \
vpxor x3 , x2 , x2 ; \
vpor x4 , x0 , x0 ; \
vpxor x3 , x4 , x4 ;
# define S 3 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x0 , x1 , x1 ; \
vpand x3 , x0 , x0 ; \
vpand x4 , x3 , x3 ; \
vpxor x2 , x3 , x3 ; \
vpor x1 , x4 , x4 ; \
vpand x1 , x2 , x2 ; \
vpxor x3 , x4 , x4 ; \
vpxor x3 , x0 , x0 ; \
vpxor x2 , x3 , x3 ;
# define S 4 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x0 , x3 , t p ; \
vpxor x3 , x0 , x0 ; \
vpxor x2 , t p , t p ; \
vpor x3 , x2 , x2 ; \
vpxor x1 , x0 , x0 ; \
vpxor t p , x3 , x4 ; \
vpor x0 , x2 , x2 ; \
vpxor x1 , x2 , x2 ;
# define S 4 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x0 , x1 , x1 ; \
vpxor x4 , x1 , x1 ; \
vpand x2 , x4 , x4 ; \
vpxor t p , x2 , x2 ; \
vpxor x0 , x4 , x4 ; \
vpor x1 , t p , x3 ; \
vpxor R N O T , x1 , x1 ; \
vpxor x0 , x3 , x3 ;
# define S 5 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpor x0 , x1 , t p ; \
vpxor t p , x2 , x2 ; \
vpxor R N O T , x3 , x3 ; \
vpxor x0 , x1 , x4 ; \
vpxor x2 , x0 , x0 ; \
vpand x4 , t p , x1 ; \
vpor x3 , x4 , x4 ; \
vpxor x0 , x4 , x4 ;
# define S 5 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x3 , x0 , x0 ; \
vpxor x3 , x1 , x1 ; \
vpxor x2 , x3 , x3 ; \
vpxor x1 , x0 , x0 ; \
vpand x4 , x2 , x2 ; \
vpxor x2 , x1 , x1 ; \
vpand x0 , x2 , x2 ; \
vpxor x2 , x3 , x3 ;
# define S 6 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x0 , x3 , x3 ; \
vpxor x2 , x1 , t p ; \
vpxor x0 , x2 , x2 ; \
vpand x3 , x0 , x0 ; \
vpor x3 , t p , t p ; \
vpxor R N O T , x1 , x4 ; \
vpxor t p , x0 , x0 ; \
vpxor x2 , t p , x1 ;
# define S 6 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x4 , x3 , x3 ; \
vpxor x0 , x4 , x4 ; \
vpand x0 , x2 , x2 ; \
vpxor x1 , x4 , x4 ; \
vpxor x3 , x2 , x2 ; \
vpand x1 , x3 , x3 ; \
vpxor x0 , x3 , x3 ; \
vpxor x2 , x1 , x1 ;
# define S 7 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor R N O T , x1 , t p ; \
vpxor R N O T , x0 , x0 ; \
vpand x2 , t p , x1 ; \
vpxor x3 , x1 , x1 ; \
vpor t p , x3 , x3 ; \
vpxor x2 , t p , x4 ; \
vpxor x3 , x2 , x2 ; \
vpxor x0 , x3 , x3 ; \
vpor x1 , x0 , x0 ;
# define S 7 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x0 , x2 , x2 ; \
vpxor x4 , x0 , x0 ; \
vpxor x3 , x4 , x4 ; \
vpand x0 , x3 , x3 ; \
vpxor x1 , x4 , x4 ; \
vpxor x4 , x2 , x2 ; \
vpxor x1 , x3 , x3 ; \
vpor x0 , x4 , x4 ; \
vpxor x1 , x4 , x4 ;
# define S I 0 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x0 , x1 , x1 ; \
vpor x1 , x3 , t p ; \
vpxor x1 , x3 , x4 ; \
vpxor R N O T , x0 , x0 ; \
vpxor t p , x2 , x2 ; \
vpxor x0 , t p , x3 ; \
vpand x1 , x0 , x0 ; \
vpxor x2 , x0 , x0 ;
# define S I 0 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x3 , x2 , x2 ; \
vpxor x4 , x3 , x3 ; \
vpxor x3 , x2 , x2 ; \
vpxor x3 , x1 , x1 ; \
vpand x0 , x3 , x3 ; \
vpxor x0 , x1 , x1 ; \
vpxor x2 , x0 , x0 ; \
vpxor x3 , x4 , x4 ;
# define S I 1 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x3 , x1 , x1 ; \
vpxor x2 , x0 , t p ; \
vpxor R N O T , x2 , x2 ; \
vpor x1 , x0 , x4 ; \
vpxor x3 , x4 , x4 ; \
vpand x1 , x3 , x3 ; \
vpxor x2 , x1 , x1 ; \
vpand x4 , x2 , x2 ;
# define S I 1 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x1 , x4 , x4 ; \
vpor x3 , x1 , x1 ; \
vpxor t p , x3 , x3 ; \
vpxor t p , x2 , x2 ; \
vpor x4 , t p , x0 ; \
vpxor x4 , x2 , x2 ; \
vpxor x0 , x1 , x1 ; \
vpxor x1 , x4 , x4 ;
# define S I 2 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x1 , x2 , x2 ; \
vpxor R N O T , x3 , t p ; \
vpor x2 , t p , t p ; \
vpxor x3 , x2 , x2 ; \
vpxor x0 , x3 , x4 ; \
vpxor x1 , t p , x3 ; \
vpor x2 , x1 , x1 ; \
vpxor x0 , x2 , x2 ;
# define S I 2 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x4 , x1 , x1 ; \
vpor x3 , x4 , x4 ; \
vpxor x3 , x2 , x2 ; \
vpxor x2 , x4 , x4 ; \
vpand x1 , x2 , x2 ; \
vpxor x3 , x2 , x2 ; \
vpxor x4 , x3 , x3 ; \
vpxor x0 , x4 , x4 ;
# define S I 3 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x1 , x2 , x2 ; \
vpand x2 , x1 , t p ; \
vpxor x0 , t p , t p ; \
vpor x1 , x0 , x0 ; \
vpxor x3 , x1 , x4 ; \
vpxor x3 , x0 , x0 ; \
vpor t p , x3 , x3 ; \
vpxor x2 , t p , x1 ;
# define S I 3 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x3 , x1 , x1 ; \
vpxor x2 , x0 , x0 ; \
vpxor x3 , x2 , x2 ; \
vpand x1 , x3 , x3 ; \
vpxor x0 , x1 , x1 ; \
vpand x2 , x0 , x0 ; \
vpxor x3 , x4 , x4 ; \
vpxor x0 , x3 , x3 ; \
vpxor x1 , x0 , x0 ;
# define S I 4 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x3 , x2 , x2 ; \
vpand x1 , x0 , t p ; \
vpxor x2 , t p , t p ; \
vpor x3 , x2 , x2 ; \
vpxor R N O T , x0 , x4 ; \
vpxor t p , x1 , x1 ; \
vpxor x2 , t p , x0 ; \
vpand x4 , x2 , x2 ;
# define S I 4 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x0 , x2 , x2 ; \
vpor x4 , x0 , x0 ; \
vpxor x3 , x0 , x0 ; \
vpand x2 , x3 , x3 ; \
vpxor x3 , x4 , x4 ; \
vpxor x1 , x3 , x3 ; \
vpand x0 , x1 , x1 ; \
vpxor x1 , x4 , x4 ; \
vpxor x3 , x0 , x0 ;
# define S I 5 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpor x2 , x1 , t p ; \
vpxor x1 , x2 , x2 ; \
vpxor x3 , t p , t p ; \
vpand x1 , x3 , x3 ; \
vpxor x3 , x2 , x2 ; \
vpor x0 , x3 , x3 ; \
vpxor R N O T , x0 , x0 ; \
vpxor x2 , x3 , x3 ; \
vpor x0 , x2 , x2 ;
# define S I 5 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor t p , x1 , x4 ; \
vpxor x4 , x2 , x2 ; \
vpand x0 , x4 , x4 ; \
vpxor t p , x0 , x0 ; \
vpxor x3 , t p , x1 ; \
vpand x2 , x0 , x0 ; \
vpxor x3 , x2 , x2 ; \
vpxor x2 , x0 , x0 ; \
vpxor x4 , x2 , x2 ; \
vpxor x3 , x4 , x4 ;
# define S I 6 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor x2 , x0 , x0 ; \
vpand x3 , x0 , t p ; \
vpxor x3 , x2 , x2 ; \
vpxor x2 , t p , t p ; \
vpxor x1 , x3 , x3 ; \
vpor x0 , x2 , x2 ; \
vpxor x3 , x2 , x2 ; \
vpand t p , x3 , x3 ;
# define S I 6 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpxor R N O T , t p , t p ; \
vpxor x1 , x3 , x3 ; \
vpand x2 , x1 , x1 ; \
vpxor t p , x0 , x4 ; \
vpxor x4 , x3 , x3 ; \
vpxor x2 , x4 , x4 ; \
vpxor x1 , t p , x0 ; \
vpxor x0 , x2 , x2 ;
# define S I 7 _ 1 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x0 , x3 , t p ; \
vpxor x2 , x0 , x0 ; \
vpor x3 , x2 , x2 ; \
vpxor x1 , x3 , x4 ; \
vpxor R N O T , x0 , x0 ; \
vpor t p , x1 , x1 ; \
vpxor x0 , x4 , x4 ; \
vpand x2 , x0 , x0 ; \
vpxor x1 , x0 , x0 ;
# define S I 7 _ 2 ( x0 , x1 , x2 , x3 , x4 ) \
vpand x2 , x1 , x1 ; \
vpxor x2 , t p , x3 ; \
vpxor x3 , x4 , x4 ; \
vpand x3 , x2 , x2 ; \
vpor x0 , x3 , x3 ; \
vpxor x4 , x1 , x1 ; \
vpxor x4 , x3 , x3 ; \
vpand x0 , x4 , x4 ; \
vpxor x2 , x4 , x4 ;
# define g e t _ k e y ( i ,j ,t ) \
vpbroadcastd ( 4 * ( i ) + ( j ) ) * 4 ( C T X ) , t ;
# define K 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
get_ k e y ( i , 0 , R K 0 ) ; \
get_ k e y ( i , 1 , R K 1 ) ; \
get_ k e y ( i , 2 , R K 2 ) ; \
get_ k e y ( i , 3 , R K 3 ) ; \
vpxor R K 0 , x0 ## 1 , x0 ## 1 ; \
vpxor R K 1 , x1 ## 1 , x1 ## 1 ; \
vpxor R K 2 , x2 ## 1 , x2 ## 1 ; \
vpxor R K 3 , x3 ## 1 , x3 ## 1 ; \
vpxor R K 0 , x0 ## 2 , x0 ## 2 ; \
vpxor R K 1 , x1 ## 2 , x1 ## 2 ; \
vpxor R K 2 , x2 ## 2 , x2 ## 2 ; \
vpxor R K 3 , x3 ## 2 , x3 ## 2 ;
# define L K 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
vpslld $ 1 3 , x0 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 1 3 ) , x0 ## 1 , x0 ## 1 ; \
vpor x4 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor x0 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpslld $ 3 , x2 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 3 ) , x2 ## 1 , x2 ## 1 ; \
vpor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpxor x2 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpslld $ 1 3 , x0 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 1 3 ) , x0 ## 2 , x0 ## 2 ; \
vpor x4 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor x0 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpslld $ 3 , x2 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 3 ) , x2 ## 2 , x2 ## 2 ; \
vpor x4 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpxor x2 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpslld $ 1 , x1 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 1 ) , x1 ## 1 , x1 ## 1 ; \
vpor x4 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpslld $ 3 , x0 ## 1 , x4 ## 1 ; \
vpxor x2 ## 1 , x3 ## 1 , x3 ## 1 ; \
vpxor x4 ## 1 , x3 ## 1 , x3 ## 1 ; \
get_ k e y ( i , 1 , R K 1 ) ; \
vpslld $ 1 , x1 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 1 ) , x1 ## 2 , x1 ## 2 ; \
vpor x4 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpslld $ 3 , x0 ## 2 , x4 ## 2 ; \
vpxor x2 ## 2 , x3 ## 2 , x3 ## 2 ; \
vpxor x4 ## 2 , x3 ## 2 , x3 ## 2 ; \
get_ k e y ( i , 3 , R K 3 ) ; \
vpslld $ 7 , x3 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 7 ) , x3 ## 1 , x3 ## 1 ; \
vpor x4 ## 1 , x3 ## 1 , x3 ## 1 ; \
vpslld $ 7 , x1 ## 1 , x4 ## 1 ; \
vpxor x1 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor x3 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor x3 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpxor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
get_ k e y ( i , 0 , R K 0 ) ; \
vpslld $ 7 , x3 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 7 ) , x3 ## 2 , x3 ## 2 ; \
vpor x4 ## 2 , x3 ## 2 , x3 ## 2 ; \
vpslld $ 7 , x1 ## 2 , x4 ## 2 ; \
vpxor x1 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor x3 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor x3 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpxor x4 ## 2 , x2 ## 2 , x2 ## 2 ; \
get_ k e y ( i , 2 , R K 2 ) ; \
vpxor R K 1 , x1 ## 1 , x1 ## 1 ; \
vpxor R K 3 , x3 ## 1 , x3 ## 1 ; \
vpslld $ 5 , x0 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 5 ) , x0 ## 1 , x0 ## 1 ; \
vpor x4 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpslld $ 2 2 , x2 ## 1 , x4 ## 1 ; \
vpsrld $ ( 3 2 - 2 2 ) , x2 ## 1 , x2 ## 1 ; \
vpor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpxor R K 0 , x0 ## 1 , x0 ## 1 ; \
vpxor R K 2 , x2 ## 1 , x2 ## 1 ; \
vpxor R K 1 , x1 ## 2 , x1 ## 2 ; \
vpxor R K 3 , x3 ## 2 , x3 ## 2 ; \
vpslld $ 5 , x0 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 5 ) , x0 ## 2 , x0 ## 2 ; \
vpor x4 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpslld $ 2 2 , x2 ## 2 , x4 ## 2 ; \
vpsrld $ ( 3 2 - 2 2 ) , x2 ## 2 , x2 ## 2 ; \
vpor x4 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpxor R K 0 , x0 ## 2 , x0 ## 2 ; \
vpxor R K 2 , x2 ## 2 , x2 ## 2 ;
# define K L 2 ( x0 , x1 , x2 , x3 , x4 , i ) \
vpxor R K 0 , x0 ## 1 , x0 ## 1 ; \
vpxor R K 2 , x2 ## 1 , x2 ## 1 ; \
vpsrld $ 5 , x0 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 5 ) , x0 ## 1 , x0 ## 1 ; \
vpor x4 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor R K 3 , x3 ## 1 , x3 ## 1 ; \
vpxor R K 1 , x1 ## 1 , x1 ## 1 ; \
vpsrld $ 2 2 , x2 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 2 2 ) , x2 ## 1 , x2 ## 1 ; \
vpor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpxor x3 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpxor R K 0 , x0 ## 2 , x0 ## 2 ; \
vpxor R K 2 , x2 ## 2 , x2 ## 2 ; \
vpsrld $ 5 , x0 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 5 ) , x0 ## 2 , x0 ## 2 ; \
vpor x4 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor R K 3 , x3 ## 2 , x3 ## 2 ; \
vpxor R K 1 , x1 ## 2 , x1 ## 2 ; \
vpsrld $ 2 2 , x2 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 2 2 ) , x2 ## 2 , x2 ## 2 ; \
vpor x4 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpxor x3 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpxor x3 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpslld $ 7 , x1 ## 1 , x4 ## 1 ; \
vpxor x1 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpsrld $ 1 , x1 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 1 ) , x1 ## 1 , x1 ## 1 ; \
vpor x4 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpxor x3 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpslld $ 7 , x1 ## 2 , x4 ## 2 ; \
vpxor x1 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor x4 ## 2 , x2 ## 2 , x2 ## 2 ; \
vpsrld $ 1 , x1 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 1 ) , x1 ## 2 , x1 ## 2 ; \
vpor x4 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpsrld $ 7 , x3 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 7 ) , x3 ## 1 , x3 ## 1 ; \
vpor x4 ## 1 , x3 ## 1 , x3 ## 1 ; \
vpxor x0 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpslld $ 3 , x0 ## 1 , x4 ## 1 ; \
vpxor x4 ## 1 , x3 ## 1 , x3 ## 1 ; \
vpsrld $ 7 , x3 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 7 ) , x3 ## 2 , x3 ## 2 ; \
vpor x4 ## 2 , x3 ## 2 , x3 ## 2 ; \
vpxor x0 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpslld $ 3 , x0 ## 2 , x4 ## 2 ; \
vpxor x4 ## 2 , x3 ## 2 , x3 ## 2 ; \
vpsrld $ 1 3 , x0 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 1 3 ) , x0 ## 1 , x0 ## 1 ; \
vpor x4 ## 1 , x0 ## 1 , x0 ## 1 ; \
vpxor x2 ## 1 , x1 ## 1 , x1 ## 1 ; \
vpxor x2 ## 1 , x3 ## 1 , x3 ## 1 ; \
vpsrld $ 3 , x2 ## 1 , x4 ## 1 ; \
vpslld $ ( 3 2 - 3 ) , x2 ## 1 , x2 ## 1 ; \
vpor x4 ## 1 , x2 ## 1 , x2 ## 1 ; \
vpsrld $ 1 3 , x0 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 1 3 ) , x0 ## 2 , x0 ## 2 ; \
vpor x4 ## 2 , x0 ## 2 , x0 ## 2 ; \
vpxor x2 ## 2 , x1 ## 2 , x1 ## 2 ; \
vpxor x2 ## 2 , x3 ## 2 , x3 ## 2 ; \
vpsrld $ 3 , x2 ## 2 , x4 ## 2 ; \
vpslld $ ( 3 2 - 3 ) , x2 ## 2 , x2 ## 2 ; \
vpor x4 ## 2 , x2 ## 2 , x2 ## 2 ;
# define S ( S B O X , x0 , x1 , x2 , x3 , x4 ) \
SBOX ## _ 1 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
SBOX ## _ 2 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
SBOX ## _ 1 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
SBOX ## _ 2 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ;
# define S P ( S B O X , x0 , x1 , x2 , x3 , x4 , i ) \
get_ k e y ( i , 0 , R K 0 ) ; \
SBOX ## _ 1 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
get_ k e y ( i , 2 , R K 2 ) ; \
SBOX ## _ 2 ( x0 ## 1 , x1 ## 1 , x2 ## 1 , x3 ## 1 , x4 ## 1 ) ; \
get_ k e y ( i , 3 , R K 3 ) ; \
SBOX ## _ 1 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
get_ k e y ( i , 1 , R K 1 ) ; \
SBOX ## _ 2 ( x0 ## 2 , x1 ## 2 , x2 ## 2 , x3 ## 2 , x4 ## 2 ) ; \
# define t r a n s p o s e _ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
vpunpckldq x1 , x0 , t 0 ; \
vpunpckhdq x1 , x0 , t 2 ; \
vpunpckldq x3 , x2 , t 1 ; \
vpunpckhdq x3 , x2 , x3 ; \
\
vpunpcklqdq t 1 , t 0 , x0 ; \
vpunpckhqdq t 1 , t 0 , x1 ; \
vpunpcklqdq x3 , t 2 , x2 ; \
vpunpckhqdq x3 , t 2 , x3 ;
# define r e a d _ b l o c k s ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 )
# define w r i t e _ b l o c k s ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 ) \
transpose_ 4 x4 ( x0 , x1 , x2 , x3 , t 0 , t 1 , t 2 )
.align 8
__serpent_enc_blk16 :
/ * input :
* % rdi : ctx, C T X
* RA1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 : p l a i n t e x t
* output :
* RA1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 : c i p h e r t e x t
* /
vpcmpeqd R N O T , R N O T , R N O T ;
read_ b l o c k s ( R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
read_ b l o c k s ( R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
K2 ( R A , R B , R C , R D , R E , 0 ) ;
S( S 0 , R A , R B , R C , R D , R E ) ; LK2(RC, RB, RD, RA, RE, 1);
S( S 1 , R C , R B , R D , R A , R E ) ; LK2(RE, RD, RA, RC, RB, 2);
S( S 2 , R E , R D , R A , R C , R B ) ; LK2(RB, RD, RE, RC, RA, 3);
S( S 3 , R B , R D , R E , R C , R A ) ; LK2(RC, RA, RD, RB, RE, 4);
S( S 4 , R C , R A , R D , R B , R E ) ; LK2(RA, RD, RB, RE, RC, 5);
S( S 5 , R A , R D , R B , R E , R C ) ; LK2(RC, RA, RD, RE, RB, 6);
S( S 6 , R C , R A , R D , R E , R B ) ; LK2(RD, RB, RA, RE, RC, 7);
S( S 7 , R D , R B , R A , R E , R C ) ; LK2(RC, RA, RE, RD, RB, 8);
S( S 0 , R C , R A , R E , R D , R B ) ; LK2(RE, RA, RD, RC, RB, 9);
S( S 1 , R E , R A , R D , R C , R B ) ; LK2(RB, RD, RC, RE, RA, 10);
S( S 2 , R B , R D , R C , R E , R A ) ; LK2(RA, RD, RB, RE, RC, 11);
S( S 3 , R A , R D , R B , R E , R C ) ; LK2(RE, RC, RD, RA, RB, 12);
S( S 4 , R E , R C , R D , R A , R B ) ; LK2(RC, RD, RA, RB, RE, 13);
S( S 5 , R C , R D , R A , R B , R E ) ; LK2(RE, RC, RD, RB, RA, 14);
S( S 6 , R E , R C , R D , R B , R A ) ; LK2(RD, RA, RC, RB, RE, 15);
S( S 7 , R D , R A , R C , R B , R E ) ; LK2(RE, RC, RB, RD, RA, 16);
S( S 0 , R E , R C , R B , R D , R A ) ; LK2(RB, RC, RD, RE, RA, 17);
S( S 1 , R B , R C , R D , R E , R A ) ; LK2(RA, RD, RE, RB, RC, 18);
S( S 2 , R A , R D , R E , R B , R C ) ; LK2(RC, RD, RA, RB, RE, 19);
S( S 3 , R C , R D , R A , R B , R E ) ; LK2(RB, RE, RD, RC, RA, 20);
S( S 4 , R B , R E , R D , R C , R A ) ; LK2(RE, RD, RC, RA, RB, 21);
S( S 5 , R E , R D , R C , R A , R B ) ; LK2(RB, RE, RD, RA, RC, 22);
S( S 6 , R B , R E , R D , R A , R C ) ; LK2(RD, RC, RE, RA, RB, 23);
S( S 7 , R D , R C , R E , R A , R B ) ; LK2(RB, RE, RA, RD, RC, 24);
S( S 0 , R B , R E , R A , R D , R C ) ; LK2(RA, RE, RD, RB, RC, 25);
S( S 1 , R A , R E , R D , R B , R C ) ; LK2(RC, RD, RB, RA, RE, 26);
S( S 2 , R C , R D , R B , R A , R E ) ; LK2(RE, RD, RC, RA, RB, 27);
S( S 3 , R E , R D , R C , R A , R B ) ; LK2(RA, RB, RD, RE, RC, 28);
S( S 4 , R A , R B , R D , R E , R C ) ; LK2(RB, RD, RE, RC, RA, 29);
S( S 5 , R B , R D , R E , R C , R A ) ; LK2(RA, RB, RD, RC, RE, 30);
S( S 6 , R A , R B , R D , R C , R E ) ; LK2(RD, RE, RB, RC, RA, 31);
S( S 7 , R D , R E , R B , R C , R A ) ; K2(RA, RB, RC, RD, RE, 32);
write_ b l o c k s ( R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
write_ b l o c k s ( R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
ret;
ENDPROC( _ _ s e r p e n t _ e n c _ b l k 1 6 )
.align 8
__serpent_dec_blk16 :
/ * input :
* % rdi : ctx, C T X
* RA1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 : c i p h e r t e x t
* output :
* RC1 , R D 1 , R B 1 , R E 1 , R C 2 , R D 2 , R B 2 , R E 2 : p l a i n t e x t
* /
vpcmpeqd R N O T , R N O T , R N O T ;
read_ b l o c k s ( R A 1 , R B 1 , R C 1 , R D 1 , R K 0 , R K 1 , R K 2 ) ;
read_ b l o c k s ( R A 2 , R B 2 , R C 2 , R D 2 , R K 0 , R K 1 , R K 2 ) ;
K2 ( R A , R B , R C , R D , R E , 3 2 ) ;
SP( S I 7 , R A , R B , R C , R D , R E , 3 1 ) ; KL2(RB, RD, RA, RE, RC, 31);
SP( S I 6 , R B , R D , R A , R E , R C , 3 0 ) ; KL2(RA, RC, RE, RB, RD, 30);
SP( S I 5 , R A , R C , R E , R B , R D , 2 9 ) ; KL2(RC, RD, RA, RE, RB, 29);
SP( S I 4 , R C , R D , R A , R E , R B , 2 8 ) ; KL2(RC, RA, RB, RE, RD, 28);
SP( S I 3 , R C , R A , R B , R E , R D , 2 7 ) ; KL2(RB, RC, RD, RE, RA, 27);
SP( S I 2 , R B , R C , R D , R E , R A , 2 6 ) ; KL2(RC, RA, RE, RD, RB, 26);
SP( S I 1 , R C , R A , R E , R D , R B , 2 5 ) ; KL2(RB, RA, RE, RD, RC, 25);
SP( S I 0 , R B , R A , R E , R D , R C , 2 4 ) ; KL2(RE, RC, RA, RB, RD, 24);
SP( S I 7 , R E , R C , R A , R B , R D , 2 3 ) ; KL2(RC, RB, RE, RD, RA, 23);
SP( S I 6 , R C , R B , R E , R D , R A , 2 2 ) ; KL2(RE, RA, RD, RC, RB, 22);
SP( S I 5 , R E , R A , R D , R C , R B , 2 1 ) ; KL2(RA, RB, RE, RD, RC, 21);
SP( S I 4 , R A , R B , R E , R D , R C , 2 0 ) ; KL2(RA, RE, RC, RD, RB, 20);
SP( S I 3 , R A , R E , R C , R D , R B , 1 9 ) ; KL2(RC, RA, RB, RD, RE, 19);
SP( S I 2 , R C , R A , R B , R D , R E , 1 8 ) ; KL2(RA, RE, RD, RB, RC, 18);
SP( S I 1 , R A , R E , R D , R B , R C , 1 7 ) ; KL2(RC, RE, RD, RB, RA, 17);
SP( S I 0 , R C , R E , R D , R B , R A , 1 6 ) ; KL2(RD, RA, RE, RC, RB, 16);
SP( S I 7 , R D , R A , R E , R C , R B , 1 5 ) ; KL2(RA, RC, RD, RB, RE, 15);
SP( S I 6 , R A , R C , R D , R B , R E , 1 4 ) ; KL2(RD, RE, RB, RA, RC, 14);
SP( S I 5 , R D , R E , R B , R A , R C , 1 3 ) ; KL2(RE, RC, RD, RB, RA, 13);
SP( S I 4 , R E , R C , R D , R B , R A , 1 2 ) ; KL2(RE, RD, RA, RB, RC, 12);
SP( S I 3 , R E , R D , R A , R B , R C , 1 1 ) ; KL2(RA, RE, RC, RB, RD, 11);
SP( S I 2 , R A , R E , R C , R B , R D , 1 0 ) ; KL2(RE, RD, RB, RC, RA, 10);
SP( S I 1 , R E , R D , R B , R C , R A , 9 ) ; KL2(RA, RD, RB, RC, RE, 9);
SP( S I 0 , R A , R D , R B , R C , R E , 8 ) ; KL2(RB, RE, RD, RA, RC, 8);
SP( S I 7 , R B , R E , R D , R A , R C , 7 ) ; KL2(RE, RA, RB, RC, RD, 7);
SP( S I 6 , R E , R A , R B , R C , R D , 6 ) ; KL2(RB, RD, RC, RE, RA, 6);
SP( S I 5 , R B , R D , R C , R E , R A , 5 ) ; KL2(RD, RA, RB, RC, RE, 5);
SP( S I 4 , R D , R A , R B , R C , R E , 4 ) ; KL2(RD, RB, RE, RC, RA, 4);
SP( S I 3 , R D , R B , R E , R C , R A , 3 ) ; KL2(RE, RD, RA, RC, RB, 3);
SP( S I 2 , R E , R D , R A , R C , R B , 2 ) ; KL2(RD, RB, RC, RA, RE, 2);
SP( S I 1 , R D , R B , R C , R A , R E , 1 ) ; KL2(RE, RB, RC, RA, RD, 1);
S( S I 0 , R E , R B , R C , R A , R D ) ; K2(RC, RD, RB, RE, RA, 0);
write_ b l o c k s ( R C 1 , R D 1 , R B 1 , R E 1 , R K 0 , R K 1 , R K 2 ) ;
write_ b l o c k s ( R C 2 , R D 2 , R B 2 , R E 2 , R K 0 , R K 1 , R K 2 ) ;
ret;
ENDPROC( _ _ s e r p e n t _ d e c _ b l k 1 6 )
ENTRY( s e r p e n t _ e c b _ e n c _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ 1 6 w a y ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
call _ _ s e r p e n t _ e n c _ b l k 1 6 ;
store_ 1 6 w a y ( % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ e c b _ e n c _ 1 6 w a y )
ENTRY( s e r p e n t _ e c b _ d e c _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ 1 6 w a y ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
call _ _ s e r p e n t _ d e c _ b l k 1 6 ;
store_ 1 6 w a y ( % r s i , R C 1 , R D 1 , R B 1 , R E 1 , R C 2 , R D 2 , R B 2 , R E 2 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ e c b _ d e c _ 1 6 w a y )
ENTRY( s e r p e n t _ c b c _ d e c _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst
* % rdx : src
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ 1 6 w a y ( % r d x , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
call _ _ s e r p e n t _ d e c _ b l k 1 6 ;
store_ c b c _ 1 6 w a y ( % r d x , % r s i , R C 1 , R D 1 , R B 1 , R E 1 , R C 2 , R D 2 , R B 2 , R E 2 ,
RK0 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ c b c _ d e c _ 1 6 w a y )
ENTRY( s e r p e n t _ c t r _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst ( 1 6 b l o c k s )
* % rdx : src ( 1 6 b l o c k s )
* % rcx : iv ( l i t t l e e n d i a n , 1 2 8 b i t )
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ c t r _ 1 6 w a y ( % r c x , . L b s w a p12 8 _ m a s k , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 ,
RD2 , R K 0 , R K 0 x , R K 1 , R K 1 x , R K 2 , R K 2 x , R K 3 , R K 3 x , R N O T ,
tp) ;
call _ _ s e r p e n t _ e n c _ b l k 1 6 ;
store_ c t r _ 1 6 w a y ( % r d x , % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ c t r _ 1 6 w a y )
ENTRY( s e r p e n t _ x t s _ e n c _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst ( 1 6 b l o c k s )
* % rdx : src ( 1 6 b l o c k s )
* % rcx : iv ( t ⊕ α ⁿ ∈ G F ( 2 ¹ ² ⁸ ) )
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ x t s _ 1 6 w a y ( % r c x , % r d x , % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 ,
RD2 , R K 0 , R K 0 x , R K 1 , R K 1 x , R K 2 , R K 2 x , R K 3 , R K 3 x , R N O T ,
.Lxts_gf128mul_and_shl1_mask_0 ,
.Lxts_gf128mul_and_shl1_mask_1 ) ;
call _ _ s e r p e n t _ e n c _ b l k 1 6 ;
store_ x t s _ 1 6 w a y ( % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 , R D 2 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ x t s _ e n c _ 1 6 w a y )
ENTRY( s e r p e n t _ x t s _ d e c _ 1 6 w a y )
/ * input :
* % rdi : ctx, C T X
* % rsi : dst ( 1 6 b l o c k s )
* % rdx : src ( 1 6 b l o c k s )
* % rcx : iv ( t ⊕ α ⁿ ∈ G F ( 2 ¹ ² ⁸ ) )
* /
2016-01-22 01:49:19 +03:00
FRAME_ B E G I N
2013-04-13 14:46:55 +04:00
vzeroupper;
load_ x t s _ 1 6 w a y ( % r c x , % r d x , % r s i , R A 1 , R B 1 , R C 1 , R D 1 , R A 2 , R B 2 , R C 2 ,
RD2 , R K 0 , R K 0 x , R K 1 , R K 1 x , R K 2 , R K 2 x , R K 3 , R K 3 x , R N O T ,
.Lxts_gf128mul_and_shl1_mask_0 ,
.Lxts_gf128mul_and_shl1_mask_1 ) ;
call _ _ s e r p e n t _ d e c _ b l k 1 6 ;
store_ x t s _ 1 6 w a y ( % r s i , R C 1 , R D 1 , R B 1 , R E 1 , R C 2 , R D 2 , R B 2 , R E 2 ) ;
vzeroupper;
2016-01-22 01:49:19 +03:00
FRAME_ E N D
2013-04-13 14:46:55 +04:00
ret;
ENDPROC( s e r p e n t _ x t s _ d e c _ 1 6 w a y )