2019-05-27 08:55:01 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2014-07-29 17:14:14 +01:00
/ * sha1 - a r m v7 - n e o n . S - A R M / N E O N a c c e l e r a t e d S H A - 1 t r a n s f o r m f u n c t i o n
*
* Copyright © 2 0 1 3 - 2 0 1 4 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>
* /
# include < l i n u x / l i n k a g e . h >
2014-08-05 21:15:19 +01:00
# include < a s m / a s s e m b l e r . h >
2014-07-29 17:14:14 +01:00
.syntax unified
.fpu neon
.text
/* 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
/* Constants */
# define K 1 0 x5 A 8 2 7 9 9 9
# define K 2 0 x6 E D 9 E B A 1
# define K 3 0 x8 F 1 B B C D C
# define K 4 0 x C A 6 2 C 1 D 6
.align 4
.LK_VEC :
.LK1 : .long K1 , K 1 , K 1 , K 1
.LK2 : .long K2 , K 2 , K 2 , K 2
.LK3 : .long K3 , K 3 , K 3 , K 3
.LK4 : .long K4 , K 4 , K 4 , K 4
/* Register macros */
# define R S T A T E r0
# define R D A T A r1
# define R N B L K S r2
# define R O L D S T A C K r3
# define R W K l r
# define _ a r4
# define _ b r5
# define _ c r6
# define _ d r7
# define _ e r8
# define R T 0 r9
# define R T 1 r10
# define R T 2 r11
# define R T 3 r12
# define W 0 q0
2014-08-05 21:15:19 +01:00
# define W 1 q7
2014-07-29 17:14:14 +01:00
# define W 2 q2
# define W 3 q3
# define W 4 q4
2014-08-05 21:15:19 +01:00
# define W 5 q6
# define W 6 q5
# define W 7 q1
2014-07-29 17:14:14 +01:00
# define t m p0 q8
# define t m p1 q9
# define t m p2 q10
# define t m p3 q11
# define q K 1 q12
# define q K 2 q13
# define q K 3 q14
# define q K 4 q15
2014-08-05 21:15:19 +01:00
# ifdef C O N F I G _ C P U _ B I G _ E N D I A N
# define A R M _ L E ( c o d e . . . )
# else
# define A R M _ L E ( c o d e . . . ) c o d e
# endif
2014-07-29 17:14:14 +01:00
/* Round function macros. */
# define W K _ o f f s ( i ) ( ( ( i ) & 1 5 ) * 4 )
# define _ R _ F 1 ( a ,b ,c ,d ,e ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
ldr R T 3 , [ s p , W K _ o f f s ( i ) ] ; \
pre1 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
bic R T 0 , d , b ; \
add e , e , a , r o r #( 32 - 5 ) ; \
and R T 1 , c , b ; \
pre2 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
add R T 0 , R T 0 , R T 3 ; \
add e , e , R T 1 ; \
ror b , #( 32 - 3 0 ) ; \
pre3 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
add e , e , R T 0 ;
# define _ R _ F 2 ( a ,b ,c ,d ,e ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
ldr R T 3 , [ s p , W K _ o f f s ( i ) ] ; \
pre1 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
eor R T 0 , d , b ; \
add e , e , a , r o r #( 32 - 5 ) ; \
eor R T 0 , R T 0 , c ; \
pre2 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
add e , e , R T 3 ; \
ror b , #( 32 - 3 0 ) ; \
pre3 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
add e , e , R T 0 ; \
# define _ R _ F 3 ( a ,b ,c ,d ,e ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
ldr R T 3 , [ s p , W K _ o f f s ( i ) ] ; \
pre1 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
eor R T 0 , b , c ; \
and R T 1 , b , c ; \
add e , e , a , r o r #( 32 - 5 ) ; \
pre2 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
and R T 0 , R T 0 , d ; \
add R T 1 , R T 1 , R T 3 ; \
add e , e , R T 0 ; \
ror b , #( 32 - 3 0 ) ; \
pre3 ( i 1 6 ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) ; \
add e , e , R T 1 ;
# define _ R _ F 4 ( a ,b ,c ,d ,e ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
_ R_ F 2 ( a ,b ,c ,d ,e ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 )
# define _ R ( a ,b ,c ,d ,e ,f ,i ,p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
_ R_ ## f ( a , b , c , d , e , i , p r e 1 ,p r e 2 ,p r e 3 ,i 1 6 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 )
# define R ( a ,b ,c ,d ,e ,f ,i ) \
_ R_ ## f ( a , b , c , d , e , i , d u m m y , d u m m y , d u m m y , i 16 ,\
W,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 )
# define d u m m y ( . . . )
/* Input expansion macros. */
/********* Precalc macros for rounds 0-15 *************************************/
# define W _ P R E C A L C _ 0 0 _ 1 5 ( ) \
add R W K , s p , #( W K _ o f f s ( 0 ) ) ; \
\
2014-08-05 21:15:19 +01:00
vld1 . 3 2 { W 0 , W 7 } , [ R D A T A ] ! ; \
ARM_ L E ( v r e v32 . 8 W 0 , W 0 ; ) /* big => little */ \
vld1 . 3 2 { W 6 , W 5 } , [ R D A T A ] ! ; \
2014-07-29 17:14:14 +01:00
vadd. u 3 2 t m p0 , W 0 , c u r K ; \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 7 , W 7 ; ) /* big => little */ \
ARM_ L E ( v r e v32 . 8 W 6 , W 6 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
vadd. u 3 2 t m p1 , W 7 , c u r K ; \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 5 , W 5 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
vadd. u 3 2 t m p2 , W 6 , c u r K ; \
vst1 . 3 2 { t m p0 , t m p1 } , [ R W K ] ! ; \
vadd. u 3 2 t m p3 , W 5 , c u r K ; \
vst1 . 3 2 { t m p2 , t m p3 } , [ R W K ] ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 0 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
vld1 . 3 2 { W 0 , W 7 } , [ R D A T A ] ! ; \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 1 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
add R W K , s p , #( W K _ o f f s ( 0 ) ) ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 2 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 0 , W 0 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 3 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
vld1 . 3 2 { W 6 , W 5 } , [ R D A T A ] ! ; \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 4 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p0 , W 0 , c u r K ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 5 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 7 , W 7 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 6 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 6 , W 6 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 7 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p1 , W 7 , c u r K ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 8 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
2014-08-05 21:15:19 +01:00
ARM_ L E ( v r e v32 . 8 W 5 , W 5 ; ) /* big => little */ \
2014-07-29 17:14:14 +01:00
# define W P R E C A L C _ 0 0 _ 1 5 _ 9 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p2 , W 6 , c u r K ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 1 0 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vst1 . 3 2 { t m p0 , t m p1 } , [ R W K ] ! ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 1 1 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p3 , W 5 , c u r K ; \
# define W P R E C A L C _ 0 0 _ 1 5 _ 1 2 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vst1 . 3 2 { t m p2 , t m p3 } , [ R W K ] ; \
/********* Precalc macros for rounds 16-31 ************************************/
# define W P R E C A L C _ 1 6 _ 3 1 _ 0 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor t m p0 , t m p0 ; \
vext. 8 W , W _ m 1 6 , W _ m 1 2 , #8 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 1 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
add R W K , s p , #( W K _ o f f s ( i ) ) ; \
vext. 8 t m p0 , W _ m 0 4 , t m p0 , #4 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 2 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor t m p0 , t m p0 , W _ m 1 6 ; \
veor. 3 2 W , W , W _ m 0 8 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 3 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor t m p1 , t m p1 ; \
veor W , W , t m p0 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 4 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vshl. u 3 2 t m p0 , W , #1 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 5 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vext. 8 t m p1 , t m p1 , W , #( 16 - 1 2 ) ; \
vshr. u 3 2 W , W , #31 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 6 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vorr t m p0 , t m p0 , W ; \
vshr. u 3 2 W , t m p1 , #30 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 7 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vshl. u 3 2 t m p1 , t m p1 , #2 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 8 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor t m p0 , t m p0 , W ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 9 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor W , t m p0 , t m p1 ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 1 0 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p0 , W , c u r K ; \
# define W P R E C A L C _ 1 6 _ 3 1 _ 1 1 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vst1 . 3 2 { t m p0 } , [ R W K ] ;
/********* Precalc macros for rounds 32-79 ************************************/
# define W P R E C A L C _ 3 2 _ 7 9 _ 0 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor W , W _ m 2 8 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 1 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vext. 8 t m p0 , W _ m 0 8 , W _ m 0 4 , #8 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 2 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor W , W _ m 1 6 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 3 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
veor W , t m p0 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 4 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
add R W K , s p , #( W K _ o f f s ( i & ~ 3 ) ) ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 5 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vshl. u 3 2 t m p1 , W , #2 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 6 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vshr. u 3 2 t m p0 , W , #30 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 7 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vorr W , t m p0 , t m p1 ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 8 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vadd. u 3 2 t m p0 , W , c u r K ; \
# define W P R E C A L C _ 3 2 _ 7 9 _ 9 ( i ,W ,W _ m 0 4 ,W _ m 0 8 ,W _ m 1 2 ,W _ m 1 6 ,W _ m 2 0 ,W _ m 2 4 ,W _ m 2 8 ) \
vst1 . 3 2 { t m p0 } , [ R W K ] ;
/ *
* Transform n b l k s * 6 4 b y t e s ( n b l k s * 1 6 3 2 - b i t w o r d s ) a t D A T A .
*
* unsigned i n t
* sha1 _ t r a n s f o r m _ n e o n ( v o i d * c t x , c o n s t u n s i g n e d c h a r * d a t a ,
* unsigned i n t n b l k s )
* /
.align 3
ENTRY( s h a1 _ t r a n s f o r m _ n e o n )
/ * input :
* r0 : ctx, C T X
* r1 : data ( 6 4 * n b l k s b y t e s )
* r2 : nblks
* /
cmp R N B L K S , #0 ;
beq . L d o _ n o t h i n g ;
push { r4 - r12 , l r } ;
/*vpush {q4-q7};*/
adr R T 3 , . L K _ V E C ;
mov R O L D S T A C K , s p ;
/* Align stack. */
sub R T 0 , s p , #( 16 * 4 ) ;
and R T 0 , #( ~ ( 16 - 1 ) ) ;
mov s p , R T 0 ;
vld1 . 3 2 { q K 1 - q K 2 } , [ R T 3 ] ! ; /* Load K1,K2 */
/* Get the values of the chaining variables. */
ldm R S T A T E , { _ a - _ e } ;
vld1 . 3 2 { q K 3 - q K 4 } , [ R T 3 ] ; /* Load K3,K4 */
# undef c u r K
# define c u r K q K 1
/* Precalc 0-15. */
W_ P R E C A L C _ 0 0 _ 1 5 ( ) ;
.Loop :
/* Transform 0-15 + Precalc 16-31. */
_ R( _ a , _ b , _ c , _ d , _ e , F 1 , 0 ,
WPRECALC_ 1 6 _ 3 1 _ 0 , W P R E C A L C _ 1 6 _ 3 1 _ 1 , W P R E C A L C _ 1 6 _ 3 1 _ 2 , 1 6 ,
W4 , W 5 , W 6 , W 7 , W 0 , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 1 , 1 ,
WPRECALC_ 1 6 _ 3 1 _ 3 , W P R E C A L C _ 1 6 _ 3 1 _ 4 , W P R E C A L C _ 1 6 _ 3 1 _ 5 , 1 6 ,
W4 , W 5 , W 6 , W 7 , W 0 , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 1 , 2 ,
WPRECALC_ 1 6 _ 3 1 _ 6 , W P R E C A L C _ 1 6 _ 3 1 _ 7 , W P R E C A L C _ 1 6 _ 3 1 _ 8 , 1 6 ,
W4 , W 5 , W 6 , W 7 , W 0 , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 1 , 3 ,
WPRECALC_ 1 6 _ 3 1 _ 9 , W P R E C A L C _ 1 6 _ 3 1 _ 1 0 ,W P R E C A L C _ 1 6 _ 3 1 _ 1 1 ,1 6 ,
W4 , W 5 , W 6 , W 7 , W 0 , _ , _ , _ ) ;
# undef c u r K
# define c u r K q K 2
_ R( _ b , _ c , _ d , _ e , _ a , F 1 , 4 ,
WPRECALC_ 1 6 _ 3 1 _ 0 , W P R E C A L C _ 1 6 _ 3 1 _ 1 , W P R E C A L C _ 1 6 _ 3 1 _ 2 , 2 0 ,
W3 , W 4 , W 5 , W 6 , W 7 , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 1 , 5 ,
WPRECALC_ 1 6 _ 3 1 _ 3 , W P R E C A L C _ 1 6 _ 3 1 _ 4 , W P R E C A L C _ 1 6 _ 3 1 _ 5 , 2 0 ,
W3 , W 4 , W 5 , W 6 , W 7 , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 1 , 6 ,
WPRECALC_ 1 6 _ 3 1 _ 6 , W P R E C A L C _ 1 6 _ 3 1 _ 7 , W P R E C A L C _ 1 6 _ 3 1 _ 8 , 2 0 ,
W3 , W 4 , W 5 , W 6 , W 7 , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 1 , 7 ,
WPRECALC_ 1 6 _ 3 1 _ 9 , W P R E C A L C _ 1 6 _ 3 1 _ 1 0 ,W P R E C A L C _ 1 6 _ 3 1 _ 1 1 ,2 0 ,
W3 , W 4 , W 5 , W 6 , W 7 , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 1 , 8 ,
WPRECALC_ 1 6 _ 3 1 _ 0 , W P R E C A L C _ 1 6 _ 3 1 _ 1 , W P R E C A L C _ 1 6 _ 3 1 _ 2 , 2 4 ,
W2 , W 3 , W 4 , W 5 , W 6 , _ , _ , _ ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 1 , 9 ,
WPRECALC_ 1 6 _ 3 1 _ 3 , W P R E C A L C _ 1 6 _ 3 1 _ 4 , W P R E C A L C _ 1 6 _ 3 1 _ 5 , 2 4 ,
W2 , W 3 , W 4 , W 5 , W 6 , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 1 , 1 0 ,
WPRECALC_ 1 6 _ 3 1 _ 6 , W P R E C A L C _ 1 6 _ 3 1 _ 7 , W P R E C A L C _ 1 6 _ 3 1 _ 8 , 2 4 ,
W2 , W 3 , W 4 , W 5 , W 6 , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 1 , 1 1 ,
WPRECALC_ 1 6 _ 3 1 _ 9 , W P R E C A L C _ 1 6 _ 3 1 _ 1 0 ,W P R E C A L C _ 1 6 _ 3 1 _ 1 1 ,2 4 ,
W2 , W 3 , W 4 , W 5 , W 6 , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 1 , 1 2 ,
WPRECALC_ 1 6 _ 3 1 _ 0 , W P R E C A L C _ 1 6 _ 3 1 _ 1 , W P R E C A L C _ 1 6 _ 3 1 _ 2 , 2 8 ,
W1 , W 2 , W 3 , W 4 , W 5 , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 1 , 1 3 ,
WPRECALC_ 1 6 _ 3 1 _ 3 , W P R E C A L C _ 1 6 _ 3 1 _ 4 , W P R E C A L C _ 1 6 _ 3 1 _ 5 , 2 8 ,
W1 , W 2 , W 3 , W 4 , W 5 , _ , _ , _ ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 1 , 1 4 ,
WPRECALC_ 1 6 _ 3 1 _ 6 , W P R E C A L C _ 1 6 _ 3 1 _ 7 , W P R E C A L C _ 1 6 _ 3 1 _ 8 , 2 8 ,
W1 , W 2 , W 3 , W 4 , W 5 , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 1 , 1 5 ,
WPRECALC_ 1 6 _ 3 1 _ 9 , W P R E C A L C _ 1 6 _ 3 1 _ 1 0 ,W P R E C A L C _ 1 6 _ 3 1 _ 1 1 ,2 8 ,
W1 , W 2 , W 3 , W 4 , W 5 , _ , _ , _ ) ;
/* Transform 16-63 + Precalc 32-79. */
_ R( _ e , _ a , _ b , _ c , _ d , F 1 , 1 6 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 3 2 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 1 , 1 7 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 3 2 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 1 , 1 8 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 3 2 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 1 , 1 9 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 3 2 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 2 , 2 0 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 3 6 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 2 , 2 1 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 3 6 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 2 , 2 2 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 3 6 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 2 , 2 3 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 3 6 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
# undef c u r K
# define c u r K q K 3
_ R( _ b , _ c , _ d , _ e , _ a , F 2 , 2 4 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 4 0 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 2 , 2 5 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 4 0 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 2 , 2 6 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 4 0 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 2 , 2 7 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 4 0 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 2 , 2 8 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 4 4 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 2 , 2 9 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 4 4 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 2 , 3 0 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 4 4 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 2 , 3 1 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 4 4 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 2 , 3 2 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 4 8 ,
W4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 2 , 3 3 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 4 8 ,
W4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 2 , 3 4 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 4 8 ,
W4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 2 , 3 5 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 4 8 ,
W4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 2 , 3 6 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 5 2 ,
W3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 2 , 3 7 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 5 2 ,
W3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 2 , 3 8 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 5 2 ,
W3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 2 , 3 9 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 5 2 ,
W3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 , W 2 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 3 , 4 0 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 5 6 ,
W2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 3 , 4 1 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 5 6 ,
W2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 3 , 4 2 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 5 6 ,
W2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 3 , 4 3 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 5 6 ,
W2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 , W 1 ) ;
# undef c u r K
# define c u r K q K 4
_ R( _ b , _ c , _ d , _ e , _ a , F 3 , 4 4 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 6 0 ,
W1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 3 , 4 5 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 6 0 ,
W1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 3 , 4 6 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 6 0 ,
W1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 3 , 4 7 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 6 0 ,
W1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 , W 0 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 3 , 4 8 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 6 4 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 3 , 4 9 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 6 4 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 3 , 5 0 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 6 4 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 3 , 5 1 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 6 4 ,
W0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 , W 7 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 3 , 5 2 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 6 8 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 3 , 5 3 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 6 8 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 3 , 5 4 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 6 8 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 3 , 5 5 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 6 8 ,
W7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 , W 6 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 3 , 5 6 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 7 2 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 3 , 5 7 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 7 2 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 3 , 5 8 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 7 2 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 3 , 5 9 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 7 2 ,
W6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 , W 5 ) ;
subs R N B L K S , #1 ;
_ R( _ a , _ b , _ c , _ d , _ e , F 4 , 6 0 ,
WPRECALC_ 3 2 _ 7 9 _ 0 , W P R E C A L C _ 3 2 _ 7 9 _ 1 , W P R E C A L C _ 3 2 _ 7 9 _ 2 , 7 6 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 4 , 6 1 ,
WPRECALC_ 3 2 _ 7 9 _ 3 , W P R E C A L C _ 3 2 _ 7 9 _ 4 , W P R E C A L C _ 3 2 _ 7 9 _ 5 , 7 6 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 4 , 6 2 ,
WPRECALC_ 3 2 _ 7 9 _ 6 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 7 , 7 6 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 4 , 6 3 ,
WPRECALC_ 3 2 _ 7 9 _ 8 , d u m m y , W P R E C A L C _ 3 2 _ 7 9 _ 9 , 7 6 ,
W5 , W 6 , W 7 , W 0 , W 1 , W 2 , W 3 , W 4 ) ;
beq . L e n d ;
/* Transform 64-79 + Precalc 0-15 of next block. */
# undef c u r K
# define c u r K q K 1
_ R( _ b , _ c , _ d , _ e , _ a , F 4 , 6 4 ,
WPRECALC_ 0 0 _ 1 5 _ 0 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 4 , 6 5 ,
WPRECALC_ 0 0 _ 1 5 _ 1 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 4 , 6 6 ,
WPRECALC_ 0 0 _ 1 5 _ 2 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 4 , 6 7 ,
WPRECALC_ 0 0 _ 1 5 _ 3 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 4 , 6 8 ,
dummy, d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 4 , 6 9 ,
dummy, d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 4 , 7 0 ,
WPRECALC_ 0 0 _ 1 5 _ 4 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 4 , 7 1 ,
WPRECALC_ 0 0 _ 1 5 _ 5 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 4 , 7 2 ,
dummy, d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 4 , 7 3 ,
dummy, d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 4 , 7 4 ,
WPRECALC_ 0 0 _ 1 5 _ 6 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ a , _ b , _ c , _ d , _ e , F 4 , 7 5 ,
WPRECALC_ 0 0 _ 1 5 _ 7 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ e , _ a , _ b , _ c , _ d , F 4 , 7 6 ,
WPRECALC_ 0 0 _ 1 5 _ 8 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ d , _ e , _ a , _ b , _ c , F 4 , 7 7 ,
WPRECALC_ 0 0 _ 1 5 _ 9 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ c , _ d , _ e , _ a , _ b , F 4 , 7 8 ,
WPRECALC_ 0 0 _ 1 5 _ 1 0 , d u m m y , d u m m y , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
_ R( _ b , _ c , _ d , _ e , _ a , F 4 , 7 9 ,
WPRECALC_ 0 0 _ 1 5 _ 1 1 , d u m m y , W P R E C A L C _ 0 0 _ 1 5 _ 1 2 , _ , _ , _ , _ , _ , _ , _ , _ , _ ) ;
/* Update the chaining variables. */
ldm R S T A T E , { R T 0 - R T 3 } ;
add _ a , R T 0 ;
ldr R T 0 , [ R S T A T E , #s t a t e _ h 4 ] ;
add _ b , R T 1 ;
add _ c , R T 2 ;
add _ d , R T 3 ;
add _ e , R T 0 ;
stm R S T A T E , { _ a - _ e } ;
b . L o o p ;
.Lend :
/* Transform 64-79 */
R( _ b , _ c , _ d , _ e , _ a , F 4 , 6 4 ) ;
R( _ a , _ b , _ c , _ d , _ e , F 4 , 6 5 ) ;
R( _ e , _ a , _ b , _ c , _ d , F 4 , 6 6 ) ;
R( _ d , _ e , _ a , _ b , _ c , F 4 , 6 7 ) ;
R( _ c , _ d , _ e , _ a , _ b , F 4 , 6 8 ) ;
R( _ b , _ c , _ d , _ e , _ a , F 4 , 6 9 ) ;
R( _ a , _ b , _ c , _ d , _ e , F 4 , 7 0 ) ;
R( _ e , _ a , _ b , _ c , _ d , F 4 , 7 1 ) ;
R( _ d , _ e , _ a , _ b , _ c , F 4 , 7 2 ) ;
R( _ c , _ d , _ e , _ a , _ b , F 4 , 7 3 ) ;
R( _ b , _ c , _ d , _ e , _ a , F 4 , 7 4 ) ;
R( _ a , _ b , _ c , _ d , _ e , F 4 , 7 5 ) ;
R( _ e , _ a , _ b , _ c , _ d , F 4 , 7 6 ) ;
R( _ d , _ e , _ a , _ b , _ c , F 4 , 7 7 ) ;
R( _ c , _ d , _ e , _ a , _ b , F 4 , 7 8 ) ;
R( _ b , _ c , _ d , _ e , _ a , F 4 , 7 9 ) ;
mov s p , R O L D S T A C K ;
/* Update the chaining variables. */
ldm R S T A T E , { R T 0 - R T 3 } ;
add _ a , R T 0 ;
ldr R T 0 , [ R S T A T E , #s t a t e _ h 4 ] ;
add _ b , R T 1 ;
add _ c , R T 2 ;
add _ d , R T 3 ;
/*vpop {q4-q7};*/
add _ e , R T 0 ;
stm R S T A T E , { _ a - _ e } ;
pop { r4 - r12 , p c } ;
.Ldo_nothing :
bx l r
ENDPROC( s h a1 _ t r a n s f o r m _ n e o n )