2022-10-27 14:54:54 +08:00
/ / SPDX- L i c e n s e - I d e n t i f i e r : G P L - 2 . 0 - o r - l a t e r
/ *
* sm3 - n e o n - c o r e . S - S M 3 s e c u r e h a s h u s i n g N E O N i n s t r u c t i o n s
*
* Linux/ a r m 6 4 p o r t o f t h e l i b g c r y p t S M 3 i m p l e m e n t a t i o n f o r A A r c h64
*
* Copyright ( C ) 2 0 2 1 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 @iki.fi>
* Copyright ( c ) 2 0 2 2 T i a n j i a Z h a n g < t i a n j i a . z h a n g @linux.alibaba.com>
* /
# include < l i n u x / l i n k a g e . h >
2022-11-18 11:44:19 -08:00
# include < l i n u x / c f i _ t y p e s . h >
2022-10-27 14:54:54 +08:00
# include < a s m / a s s e m b l e r . h >
/* Context structure */
# define s t a t e _ h0 0
# define s t a t e _ h1 4
# define s t a t e _ h2 8
# define s t a t e _ h3 1 2
# define s t a t e _ h4 1 6
# define s t a t e _ h5 2 0
# define s t a t e _ h6 2 4
# define s t a t e _ h7 2 8
/* Stack structure */
# define S T A C K _ W _ S I Z E ( 3 2 * 2 * 3 )
# define S T A C K _ W ( 0 )
# define S T A C K _ S I Z E ( S T A C K _ W + S T A C K _ W _ S I Z E )
/* Register macros */
# define R S T A T E x0
# define R D A T A x1
# define R N B L K S x2
# define R K P T R x28
# define R F R A M E x29
# define r a w3
# define r b w4
# define r c w5
# define r d w6
# define r e w7
# define r f w8
# define r g w9
# define r h w10
# define t 0 w11
# define t 1 w12
# define t 2 w13
# define t 3 w14
# define t 4 w15
# define t 5 w16
# define t 6 w17
# define k _ e v e n w19
# define k _ o d d w20
# define a d d r0 x21
# define a d d r1 x22
# define s0 w23
# define s1 w24
# define s2 w25
# define s3 w26
# define W 0 v0
# define W 1 v1
# define W 2 v2
# define W 3 v3
# define W 4 v4
# define W 5 v5
# define X T M P 0 v6
# define X T M P 1 v7
# define X T M P 2 v16
# define X T M P 3 v17
# define X T M P 4 v18
# define X T M P 5 v19
# define X T M P 6 v20
/* Helper macros. */
# define _ ( . . . ) / * _ * /
# define c l e a r _ v e c ( x ) \
movi x . 8 h , #0 ;
# define r o l w ( o , a , n ) \
ror o , a , #( 32 - n ) ;
/* Round function macros. */
# define G G 1 _ 1 ( x , y , z , o , t ) \
eor o , x , y ;
# define G G 1 _ 2 ( x , y , z , o , t ) \
eor o , o , z ;
# define G G 1 _ 3 ( x , y , z , o , t )
# define F F 1 _ 1 ( x , y , z , o , t ) G G 1 _ 1 ( x , y , z , o , t )
# define F F 1 _ 2 ( x , y , z , o , t )
# define F F 1 _ 3 ( x , y , z , o , t ) G G 1 _ 2 ( x , y , z , o , t )
# define G G 2 _ 1 ( x , y , z , o , t ) \
bic o , z , x ;
# define G G 2 _ 2 ( x , y , z , o , t ) \
and t , y , x ;
# define G G 2 _ 3 ( x , y , z , o , t ) \
eor o , o , t ;
# define F F 2 _ 1 ( x , y , z , o , t ) \
eor o , x , y ;
# define F F 2 _ 2 ( x , y , z , o , t ) \
and t , x , y ; \
and o , o , z ;
# define F F 2 _ 3 ( x , y , z , o , t ) \
eor o , o , t ;
# define R ( i , a , b , c , d , e , f , g , h , k , K _ L O A D , r o u n d , w i d x , w t y p e , I O P , i o p _ p a r a m ) \
K_ L O A D ( r o u n d ) ; \
ldr t 5 , [ s p , #( w t y p e # # _ W 1 _ A D D R ( r o u n d , w i d x ) ) ] ; \
rolw( t 0 , a , 1 2 ) ; /* rol(a, 12) => t0 */ \
IOP( 1 , i o p _ p a r a m ) ; \
FF## i # # _ 1 ( a , b , c , t 1 , t 2 ) ; \
ldr t 6 , [ s p , #( w t y p e # # _ W 1 W 2 _ A D D R ( r o u n d , w i d x ) ) ] ; \
add k , k , e ; \
IOP( 2 , i o p _ p a r a m ) ; \
GG## i # # _ 1 ( e , f , g , t 3 , t 4 ) ; \
FF## i # # _ 2 ( a , b , c , t 1 , t 2 ) ; \
IOP( 3 , i o p _ p a r a m ) ; \
add k , k , t 0 ; \
add h , h , t 5 ; \
add d , d , t 6 ; /* w1w2 + d => d */ \
IOP( 4 , i o p _ p a r a m ) ; \
rolw( k , k , 7 ) ; /* rol (t0 + e + t), 7) => k */ \
GG## i # # _ 2 ( e , f , g , t 3 , t 4 ) ; \
add h , h , k ; /* h + w1 + k => h */ \
IOP( 5 , i o p _ p a r a m ) ; \
FF## i # # _ 3 ( a , b , c , t 1 , t 2 ) ; \
eor t 0 , t 0 , k ; /* k ^ t0 => t0 */ \
GG## i # # _ 3 ( e , f , g , t 3 , t 4 ) ; \
add d , d , t 1 ; /* FF(a,b,c) + d => d */ \
IOP( 6 , i o p _ p a r a m ) ; \
add t 3 , t 3 , h ; /* GG(e,f,g) + h => t3 */ \
rolw( b , b , 9 ) ; /* rol(b, 9) => b */ \
eor h , t 3 , t 3 , r o r #( 32 - 9 ) ; \
IOP( 7 , i o p _ p a r a m ) ; \
add d , d , t 0 ; /* t0 + d => d */ \
rolw( f , f , 1 9 ) ; /* rol(f, 19) => f */ \
IOP( 8 , i o p _ p a r a m ) ; \
eor h , h , t 3 , r o r #( 32 - 1 7 ) ; /* P0(t3) => h */
# define R 1 ( a , b , c , d , e , f , g , h , k , K _ L O A D , r o u n d , w i d x , w t y p e , I O P , i o p _ p a r a m ) \
R( 1 , ## a , # # b , # # c , # # d , # # e , # # f , # # g , # # h , # # k , K _ L O A D , r o u n d , w i d x , w t y p e , I O P , i o p _ p a r a m )
# define R 2 ( a , b , c , d , e , f , g , h , k , K _ L O A D , r o u n d , w i d x , w t y p e , I O P , i o p _ p a r a m ) \
R( 2 , ## a , # # b , # # c , # # d , # # e , # # f , # # g , # # h , # # k , K _ L O A D , r o u n d , w i d x , w t y p e , I O P , i o p _ p a r a m )
# define K L ( r o u n d ) \
ldp k _ e v e n , k _ o d d , [ R K P T R , #( 4 * ( r o u n d ) ) ] ;
/* Input expansion macros. */
/* Byte-swapped input address. */
# define I W _ W _ A D D R ( r o u n d , w i d x , o f f s ) \
( STACK_ W + ( ( r o u n d ) / 4 ) * 6 4 + ( o f f s ) + ( ( w i d x ) * 4 ) )
/* Expanded input address. */
# define X W _ W _ A D D R ( r o u n d , w i d x , o f f s ) \
( STACK_ W + ( ( ( ( r o u n d ) / 3 ) - 4 ) % 2 ) * 6 4 + ( o f f s ) + ( ( w i d x ) * 4 ) )
/* Rounds 1-12, byte-swapped input block addresses. */
# define I W _ W 1 _ A D D R ( r o u n d , w i d x ) I W _ W _ A D D R ( r o u n d , w i d x , 3 2 )
# define I W _ W 1 W 2 _ A D D R ( r o u n d , w i d x ) I W _ W _ A D D R ( r o u n d , w i d x , 4 8 )
/* Rounds 1-12, expanded input block addresses. */
# define X W _ W 1 _ A D D R ( r o u n d , w i d x ) X W _ W _ A D D R ( r o u n d , w i d x , 0 )
# define X W _ W 1 W 2 _ A D D R ( r o u n d , w i d x ) X W _ W _ A D D R ( r o u n d , w i d x , 1 6 )
/ * Input b l o c k l o a d i n g .
* Interleaving w i t h i n r o u n d f u n c t i o n n e e d e d f o r i n - o r d e r C P U s . * /
# define L O A D _ W _ V E C _ 1 _ 1 ( ) \
add a d d r0 , s p , #I W _ W 1 _ A D D R ( 0 , 0 ) ;
# define L O A D _ W _ V E C _ 1 _ 2 ( ) \
add a d d r1 , s p , #I W _ W 1 _ A D D R ( 4 , 0 ) ;
# define L O A D _ W _ V E C _ 1 _ 3 ( ) \
ld1 { W 0 . 1 6 b } , [ R D A T A ] , #16 ;
# define L O A D _ W _ V E C _ 1 _ 4 ( ) \
ld1 { W 1 . 1 6 b } , [ R D A T A ] , #16 ;
# define L O A D _ W _ V E C _ 1 _ 5 ( ) \
ld1 { W 2 . 1 6 b } , [ R D A T A ] , #16 ;
# define L O A D _ W _ V E C _ 1 _ 6 ( ) \
ld1 { W 3 . 1 6 b } , [ R D A T A ] , #16 ;
# define L O A D _ W _ V E C _ 1 _ 7 ( ) \
rev3 2 X T M P 0 . 1 6 b , W 0 . 1 6 b ;
# define L O A D _ W _ V E C _ 1 _ 8 ( ) \
rev3 2 X T M P 1 . 1 6 b , W 1 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 1 ( ) \
rev3 2 X T M P 2 . 1 6 b , W 2 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 2 ( ) \
rev3 2 X T M P 3 . 1 6 b , W 3 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 3 ( ) \
eor X T M P 4 . 1 6 b , X T M P 1 . 1 6 b , X T M P 0 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 4 ( ) \
eor X T M P 5 . 1 6 b , X T M P 2 . 1 6 b , X T M P 1 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 5 ( ) \
st1 { X T M P 0 . 1 6 b } , [ a d d r0 ] , #16 ;
# define L O A D _ W _ V E C _ 2 _ 6 ( ) \
st1 { X T M P 4 . 1 6 b } , [ a d d r0 ] ; \
add a d d r0 , s p , #I W _ W 1 _ A D D R ( 8 , 0 ) ;
# define L O A D _ W _ V E C _ 2 _ 7 ( ) \
eor X T M P 6 . 1 6 b , X T M P 3 . 1 6 b , X T M P 2 . 1 6 b ;
# define L O A D _ W _ V E C _ 2 _ 8 ( ) \
ext W 0 . 1 6 b , X T M P 0 . 1 6 b , X T M P 0 . 1 6 b , #8 ; /* W0: xx, w0, xx, xx */
# define L O A D _ W _ V E C _ 3 _ 1 ( ) \
mov W 2 . 1 6 b , X T M P 1 . 1 6 b ; /* W2: xx, w6, w5, w4 */
# define L O A D _ W _ V E C _ 3 _ 2 ( ) \
st1 { X T M P 1 . 1 6 b } , [ a d d r1 ] , #16 ;
# define L O A D _ W _ V E C _ 3 _ 3 ( ) \
st1 { X T M P 5 . 1 6 b } , [ a d d r1 ] ; \
ext W 1 . 1 6 b , X T M P 0 . 1 6 b , X T M P 0 . 1 6 b , #4 ; /* W1: xx, w3, w2, w1 */
# define L O A D _ W _ V E C _ 3 _ 4 ( ) \
ext W 3 . 1 6 b , X T M P 1 . 1 6 b , X T M P 2 . 1 6 b , #12 ; /* W3: xx, w9, w8, w7 */
# define L O A D _ W _ V E C _ 3 _ 5 ( ) \
ext W 4 . 1 6 b , X T M P 2 . 1 6 b , X T M P 3 . 1 6 b , #8 ; /* W4: xx, w12, w11, w10 */
# define L O A D _ W _ V E C _ 3 _ 6 ( ) \
st1 { X T M P 2 . 1 6 b } , [ a d d r0 ] , #16 ;
# define L O A D _ W _ V E C _ 3 _ 7 ( ) \
st1 { X T M P 6 . 1 6 b } , [ a d d r0 ] ;
# define L O A D _ W _ V E C _ 3 _ 8 ( ) \
ext W 5 . 1 6 b , X T M P 3 . 1 6 b , X T M P 3 . 1 6 b , #4 ; /* W5: xx, w15, w14, w13 */
# define L O A D _ W _ V E C _ 1 ( i o p _ n u m , . . . ) \
LOAD_ W _ V E C _ 1 _ ## i o p _ n u m ( )
# define L O A D _ W _ V E C _ 2 ( i o p _ n u m , . . . ) \
LOAD_ W _ V E C _ 2 _ ## i o p _ n u m ( )
# define L O A D _ W _ V E C _ 3 ( i o p _ n u m , . . . ) \
LOAD_ W _ V E C _ 3 _ ## i o p _ n u m ( )
/ * Message s c h e d u l i n g . N o t e : 3 w o r d s p e r v e c t o r r e g i s t e r .
* Interleaving w i t h i n r o u n d f u n c t i o n n e e d e d f o r i n - o r d e r C P U s . * /
# define S C H E D _ W _ 1 _ 1 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* Load (w[i - 16]) => XTMP0 */ \
/* Load (w[i - 13]) => XTMP5 */ \
ext X T M P 0 . 1 6 b , w0 . 1 6 b , w0 . 1 6 b , #12 ; /* XTMP0: w0, xx, xx, xx */
# define S C H E D _ W _ 1 _ 2 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
ext X T M P 5 . 1 6 b , w1 . 1 6 b , w1 . 1 6 b , #12 ;
# define S C H E D _ W _ 1 _ 3 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
ext X T M P 0 . 1 6 b , X T M P 0 . 1 6 b , w1 . 1 6 b , #12 ; /* XTMP0: xx, w2, w1, w0 */
# define S C H E D _ W _ 1 _ 4 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
ext X T M P 5 . 1 6 b , X T M P 5 . 1 6 b , w2 . 1 6 b , #12 ;
# define S C H E D _ W _ 1 _ 5 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* w[i - 9] == w3 */ \
/* W3 ^ XTMP0 => XTMP0 */ \
eor X T M P 0 . 1 6 b , X T M P 0 . 1 6 b , w3 . 1 6 b ;
# define S C H E D _ W _ 1 _ 6 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* w[i - 3] == w5 */ \
/* rol(XMM5, 15) ^ XTMP0 => XTMP0 */ \
/* rol(XTMP5, 7) => XTMP1 */ \
add a d d r0 , s p , #X W _ W 1 _ A D D R ( ( r o u n d ) , 0 ) ; \
shl X T M P 2 . 4 s , w5 . 4 s , #15 ;
# define S C H E D _ W _ 1 _ 7 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
shl X T M P 1 . 4 s , X T M P 5 . 4 s , #7 ;
# define S C H E D _ W _ 1 _ 8 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
sri X T M P 2 . 4 s , w5 . 4 s , #( 32 - 1 5 ) ;
# define S C H E D _ W _ 2 _ 1 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
sri X T M P 1 . 4 s , X T M P 5 . 4 s , #( 32 - 7 ) ;
# define S C H E D _ W _ 2 _ 2 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
eor X T M P 0 . 1 6 b , X T M P 0 . 1 6 b , X T M P 2 . 1 6 b ;
# define S C H E D _ W _ 2 _ 3 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* w[i - 6] == W4 */ \
/* W4 ^ XTMP1 => XTMP1 */ \
eor X T M P 1 . 1 6 b , X T M P 1 . 1 6 b , w4 . 1 6 b ;
# define S C H E D _ W _ 2 _ 4 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* P1(XTMP0) ^ XTMP1 => W0 */ \
shl X T M P 3 . 4 s , X T M P 0 . 4 s , #15 ;
# define S C H E D _ W _ 2 _ 5 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
shl X T M P 4 . 4 s , X T M P 0 . 4 s , #23 ;
# define S C H E D _ W _ 2 _ 6 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
eor w0 . 1 6 b , X T M P 1 . 1 6 b , X T M P 0 . 1 6 b ;
# define S C H E D _ W _ 2 _ 7 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
sri X T M P 3 . 4 s , X T M P 0 . 4 s , #( 32 - 1 5 ) ;
# define S C H E D _ W _ 2 _ 8 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
sri X T M P 4 . 4 s , X T M P 0 . 4 s , #( 32 - 2 3 ) ;
# define S C H E D _ W _ 3 _ 1 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
eor w0 . 1 6 b , w0 . 1 6 b , X T M P 3 . 1 6 b ;
# define S C H E D _ W _ 3 _ 2 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* Load (w[i - 3]) => XTMP2 */ \
ext X T M P 2 . 1 6 b , w4 . 1 6 b , w4 . 1 6 b , #12 ;
# define S C H E D _ W _ 3 _ 3 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
eor w0 . 1 6 b , w0 . 1 6 b , X T M P 4 . 1 6 b ;
# define S C H E D _ W _ 3 _ 4 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
ext X T M P 2 . 1 6 b , X T M P 2 . 1 6 b , w5 . 1 6 b , #12 ;
# define S C H E D _ W _ 3 _ 5 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
/* W1 ^ W2 => XTMP3 */ \
eor X T M P 3 . 1 6 b , X T M P 2 . 1 6 b , w0 . 1 6 b ;
# define S C H E D _ W _ 3 _ 6 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 )
# define S C H E D _ W _ 3 _ 7 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 ) \
st1 { X T M P 2 . 1 6 b - X T M P 3 . 1 6 b } , [ a d d r0 ] ;
# define S C H E D _ W _ 3 _ 8 ( r o u n d , w0 , w1 , w2 , w3 , w4 , w5 )
# define S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 )
# define S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 )
# define S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 )
# define S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 1 , W 2 , W 3 , W 4 , W 5 , W 0 )
# define S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 1 , W 2 , W 3 , W 4 , W 5 , W 0 )
# define S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 1 , W 2 , W 3 , W 4 , W 5 , W 0 )
# define S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 2 , W 3 , W 4 , W 5 , W 0 , W 1 )
# define S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 2 , W 3 , W 4 , W 5 , W 0 , W 1 )
# define S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 2 , W 3 , W 4 , W 5 , W 0 , W 1 )
# define S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 3 , W 4 , W 5 , W 0 , W 1 , W 2 )
# define S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 3 , W 4 , W 5 , W 0 , W 1 , W 2 )
# define S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 3 , W 4 , W 5 , W 0 , W 1 , W 2 )
# define S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 4 , W 5 , W 0 , W 1 , W 2 , W 3 )
# define S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 4 , W 5 , W 0 , W 1 , W 2 , W 3 )
# define S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 4 , W 5 , W 0 , W 1 , W 2 , W 3 )
# define S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 1 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 1 _ ## i o p _ n u m ( r o u n d , W 5 , W 0 , W 1 , W 2 , W 3 , W 4 )
# define S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 2 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 2 _ ## i o p _ n u m ( r o u n d , W 5 , W 0 , W 1 , W 2 , W 3 , W 4 )
# define S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 3 ( i o p _ n u m , r o u n d ) \
SCHED_ W _ 3 _ ## i o p _ n u m ( r o u n d , W 5 , W 0 , W 1 , W 2 , W 3 , W 4 )
/ *
* Transform b l o c k s * 6 4 b y t e s ( b l o c k s * 1 6 3 2 - b i t w o r d s ) a t ' s r c ' .
*
* void s m 3 _ n e o n _ t r a n s f o r m ( s t r u c t s m 3 _ s t a t e * s s t , u 8 c o n s t * s r c ,
* int b l o c k s )
* /
.text
.align 3
2022-11-18 11:44:19 -08:00
SYM_ T Y P E D _ F U N C _ S T A R T ( s m 3 _ n e o n _ t r a n s f o r m )
2022-10-27 14:54:54 +08:00
ldp r a , r b , [ R S T A T E , #0 ]
ldp r c , r d , [ R S T A T E , #8 ]
ldp r e , r f , [ R S T A T E , #16 ]
ldp r g , r h , [ R S T A T E , #24 ]
stp x28 , x29 , [ s p , #- 16 ] !
stp x19 , x20 , [ s p , #- 16 ] !
stp x21 , x22 , [ s p , #- 16 ] !
stp x23 , x24 , [ s p , #- 16 ] !
stp x25 , x26 , [ s p , #- 16 ] !
mov R F R A M E , s p
sub a d d r0 , s p , #S T A C K _ S I Z E
adr_ l R K P T R , . L K t a b l e
and s p , a d d r0 , #( ~ 63 )
/* Preload first block. */
LOAD_ W _ V E C _ 1 ( 1 , 0 )
LOAD_ W _ V E C _ 1 ( 2 , 0 )
LOAD_ W _ V E C _ 1 ( 3 , 0 )
LOAD_ W _ V E C _ 1 ( 4 , 0 )
LOAD_ W _ V E C _ 1 ( 5 , 0 )
LOAD_ W _ V E C _ 1 ( 6 , 0 )
LOAD_ W _ V E C _ 1 ( 7 , 0 )
LOAD_ W _ V E C _ 1 ( 8 , 0 )
LOAD_ W _ V E C _ 2 ( 1 , 0 )
LOAD_ W _ V E C _ 2 ( 2 , 0 )
LOAD_ W _ V E C _ 2 ( 3 , 0 )
LOAD_ W _ V E C _ 2 ( 4 , 0 )
LOAD_ W _ V E C _ 2 ( 5 , 0 )
LOAD_ W _ V E C _ 2 ( 6 , 0 )
LOAD_ W _ V E C _ 2 ( 7 , 0 )
LOAD_ W _ V E C _ 2 ( 8 , 0 )
LOAD_ W _ V E C _ 3 ( 1 , 0 )
LOAD_ W _ V E C _ 3 ( 2 , 0 )
LOAD_ W _ V E C _ 3 ( 3 , 0 )
LOAD_ W _ V E C _ 3 ( 4 , 0 )
LOAD_ W _ V E C _ 3 ( 5 , 0 )
LOAD_ W _ V E C _ 3 ( 6 , 0 )
LOAD_ W _ V E C _ 3 ( 7 , 0 )
LOAD_ W _ V E C _ 3 ( 8 , 0 )
.balign 16
.Loop :
/* Transform 0-3 */
R1 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 0 , 0 , I W , _ , 0 )
R1 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 1 , 1 , I W , _ , 0 )
R1 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 2 , 2 , I W , _ , 0 )
R1 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 3 , 3 , I W , _ , 0 )
/* Transform 4-7 + Precalc 12-14 */
R1 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 4 , 0 , I W , _ , 0 )
R1 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 5 , 1 , I W , _ , 0 )
R1 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 6 , 2 , I W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 1 , 1 2 )
R1 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 7 , 3 , I W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 2 , 1 2 )
/* Transform 8-11 + Precalc 12-17 */
R1 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 8 , 0 , I W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 3 , 1 2 )
R1 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 9 , 1 , I W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 1 , 1 5 )
R1 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 1 0 , 2 , I W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 2 , 1 5 )
R1 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 1 1 , 3 , I W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 3 , 1 5 )
/* Transform 12-14 + Precalc 18-20 */
R1 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 1 2 , 0 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 1 , 1 8 )
R1 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 1 3 , 1 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 2 , 1 8 )
R1 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 1 4 , 2 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 3 , 1 8 )
/* Transform 15-17 + Precalc 21-23 */
R1 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 1 5 , 0 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 1 , 2 1 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 1 6 , 1 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 2 , 2 1 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 1 7 , 2 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 3 , 2 1 )
/* Transform 18-20 + Precalc 24-26 */
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 1 8 , 0 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 1 , 2 4 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 1 9 , 1 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 2 , 2 4 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 2 0 , 2 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 3 , 2 4 )
/* Transform 21-23 + Precalc 27-29 */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 2 1 , 0 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 1 , 2 7 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 2 2 , 1 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 2 , 2 7 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 2 3 , 2 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 3 , 2 7 )
/* Transform 24-26 + Precalc 30-32 */
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 2 4 , 0 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 1 , 3 0 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 2 5 , 1 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 2 , 3 0 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 2 6 , 2 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 3 , 3 0 )
/* Transform 27-29 + Precalc 33-35 */
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 2 7 , 0 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 1 , 3 3 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 2 8 , 1 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 2 , 3 3 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 2 9 , 2 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 3 , 3 3 )
/* Transform 30-32 + Precalc 36-38 */
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 3 0 , 0 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 1 , 3 6 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 3 1 , 1 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 2 , 3 6 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 3 2 , 2 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 3 , 3 6 )
/* Transform 33-35 + Precalc 39-41 */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 3 3 , 0 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 1 , 3 9 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 3 4 , 1 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 2 , 3 9 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 3 5 , 2 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 3 , 3 9 )
/* Transform 36-38 + Precalc 42-44 */
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 3 6 , 0 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 1 , 4 2 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 3 7 , 1 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 2 , 4 2 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 3 8 , 2 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 3 , 4 2 )
/* Transform 39-41 + Precalc 45-47 */
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 3 9 , 0 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 1 , 4 5 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 4 0 , 1 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 2 , 4 5 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 4 1 , 2 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 3 , 4 5 )
/* Transform 42-44 + Precalc 48-50 */
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 4 2 , 0 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 1 , 4 8 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 4 3 , 1 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 2 , 4 8 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 4 4 , 2 , X W , S C H E D _ W _ W 0 W 1 W 2 W 3 W 4 W 5 _ 3 , 4 8 )
/* Transform 45-47 + Precalc 51-53 */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 4 5 , 0 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 1 , 5 1 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 4 6 , 1 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 2 , 5 1 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 4 7 , 2 , X W , S C H E D _ W _ W 1 W 2 W 3 W 4 W 5 W 0 _ 3 , 5 1 )
/* Transform 48-50 + Precalc 54-56 */
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 4 8 , 0 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 1 , 5 4 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 4 9 , 1 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 2 , 5 4 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 5 0 , 2 , X W , S C H E D _ W _ W 2 W 3 W 4 W 5 W 0 W 1 _ 3 , 5 4 )
/* Transform 51-53 + Precalc 57-59 */
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 5 1 , 0 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 1 , 5 7 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 5 2 , 1 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 2 , 5 7 )
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 5 3 , 2 , X W , S C H E D _ W _ W 3 W 4 W 5 W 0 W 1 W 2 _ 3 , 5 7 )
/* Transform 54-56 + Precalc 60-62 */
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 5 4 , 0 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 1 , 6 0 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 5 5 , 1 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 2 , 6 0 )
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 5 6 , 2 , X W , S C H E D _ W _ W 4 W 5 W 0 W 1 W 2 W 3 _ 3 , 6 0 )
/* Transform 57-59 + Precalc 63 */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 5 7 , 0 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 1 , 6 3 )
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 5 8 , 1 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 2 , 6 3 )
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 5 9 , 2 , X W , S C H E D _ W _ W 5 W 0 W 1 W 2 W 3 W 4 _ 3 , 6 3 )
/* Transform 60 */
R2 ( r a , r b , r c , r d , r e , r f , r g , r h , k _ e v e n , K L , 6 0 , 0 , X W , _ , _ )
subs R N B L K S , R N B L K S , #1
b. e q . L e n d
/* Transform 61-63 + Preload next block */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 6 1 , 1 , X W , L O A D _ W _ V E C _ 1 , _ )
ldp s0 , s1 , [ R S T A T E , #0 ]
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 6 2 , 2 , X W , L O A D _ W _ V E C _ 2 , _ )
ldp s2 , s3 , [ R S T A T E , #8 ]
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 6 3 , 0 , X W , L O A D _ W _ V E C _ 3 , _ )
/* Update the chaining variables. */
eor r a , r a , s0
eor r b , r b , s1
ldp s0 , s1 , [ R S T A T E , #16 ]
eor r c , r c , s2
ldp k _ e v e n , k _ o d d , [ R S T A T E , #24 ]
eor r d , r d , s3
eor r e , r e , s0
stp r a , r b , [ R S T A T E , #0 ]
eor r f , r f , s1
stp r c , r d , [ R S T A T E , #8 ]
eor r g , r g , k _ e v e n
stp r e , r f , [ R S T A T E , #16 ]
eor r h , r h , k _ o d d
stp r g , r h , [ R S T A T E , #24 ]
b . L o o p
.Lend :
/* Transform 61-63 */
R2 ( r d , r a , r b , r c , r h , r e , r f , r g , k _ o d d , _ , 6 1 , 1 , X W , _ , _ )
ldp s0 , s1 , [ R S T A T E , #0 ]
R2 ( r c , r d , r a , r b , r g , r h , r e , r f , k _ e v e n , K L , 6 2 , 2 , X W , _ , _ )
ldp s2 , s3 , [ R S T A T E , #8 ]
R2 ( r b , r c , r d , r a , r f , r g , r h , r e , k _ o d d , _ , 6 3 , 0 , X W , _ , _ )
/* Update the chaining variables. */
eor r a , r a , s0
clear_ v e c ( W 0 )
eor r b , r b , s1
clear_ v e c ( W 1 )
ldp s0 , s1 , [ R S T A T E , #16 ]
clear_ v e c ( W 2 )
eor r c , r c , s2
clear_ v e c ( W 3 )
ldp k _ e v e n , k _ o d d , [ R S T A T E , #24 ]
clear_ v e c ( W 4 )
eor r d , r d , s3
clear_ v e c ( W 5 )
eor r e , r e , s0
clear_ v e c ( X T M P 0 )
stp r a , r b , [ R S T A T E , #0 ]
clear_ v e c ( X T M P 1 )
eor r f , r f , s1
clear_ v e c ( X T M P 2 )
stp r c , r d , [ R S T A T E , #8 ]
clear_ v e c ( X T M P 3 )
eor r g , r g , k _ e v e n
clear_ v e c ( X T M P 4 )
stp r e , r f , [ R S T A T E , #16 ]
clear_ v e c ( X T M P 5 )
eor r h , r h , k _ o d d
clear_ v e c ( X T M P 6 )
stp r g , r h , [ R S T A T E , #24 ]
/* Clear message expansion area */
add a d d r0 , s p , #S T A C K _ W
st1 { W 0 . 1 6 b - W 3 . 1 6 b } , [ a d d r0 ] , #64
st1 { W 0 . 1 6 b - W 3 . 1 6 b } , [ a d d r0 ] , #64
st1 { W 0 . 1 6 b - W 3 . 1 6 b } , [ a d d r0 ]
mov s p , R F R A M E
ldp x25 , x26 , [ s p ] , #16
ldp x23 , x24 , [ s p ] , #16
ldp x21 , x22 , [ s p ] , #16
ldp x19 , x20 , [ s p ] , #16
ldp x28 , x29 , [ s p ] , #16
ret
SYM_ F U N C _ E N D ( s m 3 _ n e o n _ t r a n s f o r m )
.section " .rodata " , " a"
.align 4
.LKtable :
.long 0 x7 9 c c45 1 9 , 0 x f39 8 8 a32 , 0 x e 7 3 1 1 4 6 5 , 0 x c e 6 2 2 8 c b
.long 0 x9 c c45 1 9 7 , 0 x39 8 8 a32 f , 0 x73 1 1 4 6 5 e , 0 x e 6 2 2 8 c b c
.long 0 xcc4 5 1 9 7 9 , 0 x98 8 a32 f3 , 0 x31 1 4 6 5 e 7 , 0 x62 2 8 c b c e
.long 0 xc4 5 1 9 7 9 c , 0 x88 a32 f39 , 0 x11 4 6 5 e 7 3 , 0 x22 8 c b c e 6
.long 0 x9 d8 a7 a87 , 0 x3 b14 f50 f , 0 x76 2 9 e a1 e , 0 x e c53 d43 c
.long 0 xd8 a7 a87 9 , 0 x b14 f50 f3 , 0 x62 9 e a1 e 7 , 0 x c53 d43 c e
.long 0 x8 a7 a87 9 d , 0 x14 f50 f3 b , 0 x29 e a1 e 7 6 , 0 x53 d43 c e c
.long 0 xa7 a87 9 d8 , 0 x4 f50 f3 b1 , 0 x9 e a1 e 7 6 2 , 0 x3 d43 c e c5
.long 0 x7 a87 9 d8 a , 0 x f50 f3 b14 , 0 x e a1 e 7 6 2 9 , 0 x d43 c e c53
.long 0 xa8 7 9 d8 a7 , 0 x50 f3 b14 f , 0 x a1 e 7 6 2 9 e , 0 x43 c e c53 d
.long 0 x8 7 9 d8 a7 a , 0 x0 f3 b14 f5 , 0 x1 e 7 6 2 9 e a , 0 x3 c e c53 d4
.long 0 x7 9 d8 a7 a8 , 0 x f3 b14 f50 , 0 x e 7 6 2 9 e a1 , 0 x c e c53 d43
.long 0 x9 d8 a7 a87 , 0 x3 b14 f50 f , 0 x76 2 9 e a1 e , 0 x e c53 d43 c
.long 0 xd8 a7 a87 9 , 0 x b14 f50 f3 , 0 x62 9 e a1 e 7 , 0 x c53 d43 c e
.long 0 x8 a7 a87 9 d , 0 x14 f50 f3 b , 0 x29 e a1 e 7 6 , 0 x53 d43 c e c
.long 0 xa7 a87 9 d8 , 0 x4 f50 f3 b1 , 0 x9 e a1 e 7 6 2 , 0 x3 d43 c e c5