2012-09-27 15:44:22 -07:00
/ *
* Implement f a s t C R C 3 2 C w i t h P C L M U L Q D Q i n s t r u c t i o n s . ( x86 _ 6 4 )
*
2013-02-21 11:04:22 -08:00
* The w h i t e p a p e r s o n C R C 3 2 C c a l c u l a t i o n s w i t h P C L M U L Q D Q i n s t r u c t i o n c a n b e
2012-09-27 15:44:22 -07:00
* downloaded f r o m :
2013-02-21 11:04:22 -08:00
* http : / / www. i n t e l . c o m / c o n t e n t / d a m / w w w / p u b l i c / u s / e n / d o c u m e n t s / w h i t e - p a p e r s / c r c - i s c s i - p o l y n o m i a l - c r c32 - i n s t r u c t i o n - p a p e r . p d f
* http : / / www. i n t e l . c o m / c o n t e n t / d a m / w w w / p u b l i c / u s / e n / d o c u m e n t s / w h i t e - p a p e r s / f a s t - c r c - c o m p u t a t i o n - p a p e r . p d f
2012-09-27 15:44:22 -07:00
*
* Copyright ( C ) 2 0 1 2 I n t e l C o r p o r a t i o n .
*
* Authors :
* Wajdi F e g h a l i < w a j d i . k . f e g h a l i @intel.com>
* James G u i l f o r d < j a m e s . g u i l f o r d @intel.com>
* David C o t e < d a v i d . m . c o t e @intel.com>
* Tim C h e n < t i m . c . c h e n @linux.intel.com>
*
* This s o f t w a r e i s a v a i l a b l e t o y o u u n d e r a c h o i c e o f o n e o f t w o
* licenses. Y o u m a y c h o o s e t o b e l i c e n s e d u n d e r t h e t e r m s o f t h e G N U
* General P u b l i c L i c e n s e ( G P L ) V e r s i o n 2 , a v a i l a b l e f r o m t h e f i l e
* COPYING i n t h e m a i n d i r e c t o r y o f t h i s s o u r c e t r e e , o r t h e
* OpenIB. o r g B S D l i c e n s e b e l o w :
*
* Redistribution a n d u s e i n s o u r c e a n d b i n a r y f o r m s , w i t h o r
* without m o d i f i c a t i o n , a r e p e r m i t t e d p r o v i d e d t h a t t h e f o l l o w i n g
* conditions a r e m e t :
*
* - Redistributions o f s o u r c e c o d e m u s t r e t a i n t h e a b o v e
* copyright n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g
* disclaimer.
*
* - Redistributions i n b i n a r y f o r m m u s t r e p r o d u c e t h e a b o v e
* copyright n o t i c e , t h i s l i s t o f c o n d i t i o n s a n d t h e f o l l o w i n g
* disclaimer i n t h e d o c u m e n t a t i o n a n d / o r o t h e r m a t e r i a l s
* provided w i t h t h e d i s t r i b u t i o n .
*
* THE S O F T W A R E I S P R O V I D E D " A S I S " , W I T H O U T W A R R A N T Y O F A N Y K I N D ,
* EXPRESS O R I M P L I E D , I N C L U D I N G B U T N O T L I M I T E D T O T H E W A R R A N T I E S O F
* MERCHANTABILITY, F I T N E S S F O R A P A R T I C U L A R P U R P O S E A N D
* NONINFRINGEMENT. I N N O E V E N T S H A L L T H E A U T H O R S O R C O P Y R I G H T H O L D E R S
* BE L I A B L E F O R A N Y C L A I M , D A M A G E S O R O T H E R L I A B I L I T Y , W H E T H E R I N A N
* ACTION O F C O N T R A C T , T O R T O R O T H E R W I S E , A R I S I N G F R O M , O U T O F O R I N
* CONNECTION W I T H T H E S O F T W A R E O R T H E U S E O R O T H E R D E A L I N G S I N T H E
* SOFTWARE.
* /
2013-01-19 13:39:21 +02:00
# include < l i n u x / l i n k a g e . h >
2018-01-11 21:46:27 +00:00
# include < a s m / n o s p e c - b r a n c h . h >
2013-01-19 13:39:21 +02:00
2012-09-27 15:44:22 -07:00
# # ISCSI C R C 3 2 I m p l e m e n t a t i o n w i t h c r c32 a n d p c l m u l q d q I n s t r u c t i o n
.macro LABEL prefix n
\ prefix\ n \ ( ) :
.endm
.macro JMPTBL_ENTRY i
2021-02-24 10:29:19 -06:00
.quad crc_ \ i
2012-09-27 15:44:22 -07:00
.endm
.macro JNC_LESS_THAN j
jnc l e s s _ t h a n _ \ j
.endm
# Define t h r e s h o l d w h e r e b u f f e r s a r e c o n s i d e r e d " s m a l l " a n d r o u t e d t o m o r e
# efficient " b y - 1 " c o d e . T h i s " b y - 1 " c o d e o n l y h a n d l e s u p t o 2 5 5 b y t e s , s o
# SMALL_ S I Z E c a n b e n o l a r g e r t h a n 2 5 5 .
# define S M A L L _ S I Z E 2 0 0
.if ( SMALL_ S I Z E > 2 5 5 )
.error " SMALL_ S I Z E m u s t b e < 2 5 6 "
.endif
# unsigned i n t c r c _ p c l ( u 8 * b u f f e r , i n t l e n , u n s i g n e d i n t c r c _ i n i t ) ;
2014-06-06 23:08:58 -04:00
.text
2019-10-11 13:51:04 +02:00
SYM_ F U N C _ S T A R T ( c r c _ p c l )
2020-04-22 17:16:40 +02:00
# define b u f p r d i
2012-09-27 15:44:22 -07:00
# define b u f p _ d w % e d i
# define b u f p _ w % d i
# define b u f p _ b % d i l
# define b u f p t m p % r c x
# define b l o c k _ 0 % r c x
# define b l o c k _ 1 % r d x
# define b l o c k _ 2 % r11
# define l e n % r s i
# define l e n _ d w % e s i
# define l e n _ w % s i
# define l e n _ b % s i l
# define c r c _ i n i t _ a r g % r d x
# define t m p % r b x
# define c r c _ i n i t % r8
# define c r c _ i n i t _ d w % r8 d
# define c r c1 % r9
# define c r c2 % r10
pushq % r b x
pushq % r d i
pushq % r s i
# # Move c r c _ i n i t f o r L i n u x t o a d i f f e r e n t
mov c r c _ i n i t _ a r g , c r c _ i n i t
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 1 ) ALIGN :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2020-04-22 17:16:40 +02:00
mov % b u f p , b u f p t m p # r d i = * b u f
neg % b u f p
and $ 7 , % b u f p # c a l c u l a t e t h e u n a l i g n m e n t a m o u n t o f
2012-09-27 15:44:22 -07:00
# the a d d r e s s
je p r o c _ b l o c k # S k i p i f a l i g n e d
# # If l e n i s l e s s t h a n 8 a n d w e ' r e u n a l i g n e d , w e n e e d t o j u m p
# # to s p e c i a l c o d e t o a v o i d r e a d i n g b e y o n d t h e e n d o f t h e b u f f e r
cmp $ 8 , l e n
jae d o _ a l i g n
# less_ t h a n _ 8 e x p e c t s l e n g t h i n u p p e r 3 b i t s o f l e n _ d w
# less_ t h a n _ 8 _ p o s t _ s h l 1 e x p e c t s l e n g t h = c a r r y f l a g * 8 + l e n _ d w [ 3 1 : 3 0 ]
shl $ 3 2 - 3 + 1 , l e n _ d w
jmp l e s s _ t h a n _ 8 _ p o s t _ s h l 1
do_align :
# # # # Calculate C R C o f u n a l i g n e d b y t e s o f t h e b u f f e r ( i f a n y )
movq ( b u f p t m p ) , t m p # l o a d a q u a d w a r d f r o m t h e b u f f e r
2020-04-22 17:16:40 +02:00
add % b u f p , b u f p t m p # a l i g n b u f f e r p o i n t e r f o r q u a d w o r d
2012-09-27 15:44:22 -07:00
# processing
2020-04-22 17:16:40 +02:00
sub % b u f p , l e n # u p d a t e b u f f e r l e n g t h
2012-09-27 15:44:22 -07:00
align_loop :
crc3 2 b % b l , c r c _ i n i t _ d w # c o m p u t e c r c 32 o f 1 - b y t e
shr $ 8 , t m p # g e t n e x t b y t e
2020-04-22 17:16:40 +02:00
dec % b u f p
2012-09-27 15:44:22 -07:00
jne a l i g n _ l o o p
proc_block :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 2 ) PROCESS B L O C K S :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # compute n u m o f b y t e s t o b e p r o c e s s e d
movq l e n , t m p # s a v e n u m b y t e s i n t m p
cmpq $ 1 2 8 * 2 4 , l e n
jae f u l l _ b l o c k
continue_block :
cmpq $ S M A L L _ S I Z E , l e n
jb s m a l l
# # len < 1 2 8 * 2 4
movq $ 2 7 3 1 , % r a x # 2731 = c e i l ( 2 ^ 1 6 / 2 4 )
mul l e n _ d w
shrq $ 1 6 , % r a x
# # eax c o n t a i n s f l o o r ( b y t e s / 2 4 ) = n u m 2 4 - b y t e c h u n k s t o d o
# # process r a x 2 4 - b y t e c h u n k s ( 1 2 8 > = r a x > = 0 )
# # compute e n d a d d r e s s o f e a c h b l o c k
# # block 0 ( b a s e a d d r + R A X * 8 )
# # block 1 ( b a s e a d d r + R A X * 1 6 )
# # block 2 ( b a s e a d d r + R A X * 2 4 )
lea ( b u f p t m p , % r a x , 8 ) , b l o c k _ 0
lea ( b l o c k _ 0 , % r a x , 8 ) , b l o c k _ 1
lea ( b l o c k _ 1 , % r a x , 8 ) , b l o c k _ 2
xor c r c1 , c r c1
xor c r c2 , c r c2
# # branch i n t o a r r a y
2021-02-24 10:29:19 -06:00
mov j u m p _ t a b l e ( ,% r a x ,8 ) , % b u f p
2018-01-11 21:46:27 +00:00
JMP_ N O S P E C b u f p
2012-09-27 15:44:22 -07:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 2 a) P R O C E S S F U L L B L O C K S :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
full_block :
2015-03-31 19:00:10 +02:00
movl $ 1 2 8 ,% e a x
2012-09-27 15:44:22 -07:00
lea 1 2 8 * 8 * 2 ( b l o c k _ 0 ) , b l o c k _ 1
lea 1 2 8 * 8 * 3 ( b l o c k _ 0 ) , b l o c k _ 2
add $ 1 2 8 * 8 * 1 , b l o c k _ 0
xor c r c1 ,c r c1
xor c r c2 ,c r c2
# Fall t h r u o g h i n t o t o p o f c r c a r r a y ( c r c _ 1 2 8 )
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 3 ) CRC A r r a y :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
crc_array :
i=128
.rept 1 2 8 - 1
.altmacro
LABEL c r c _ % i
.noaltmacro
crc3 2 q - i * 8 ( b l o c k _ 0 ) , c r c _ i n i t
crc3 2 q - i * 8 ( b l o c k _ 1 ) , c r c1
crc3 2 q - i * 8 ( b l o c k _ 2 ) , c r c2
i= ( i - 1 )
.endr
.altmacro
LABEL c r c _ % i
.noaltmacro
crc3 2 q - i * 8 ( b l o c k _ 0 ) , c r c _ i n i t
crc3 2 q - i * 8 ( b l o c k _ 1 ) , c r c1
# SKIP c r c32 - i * 8 ( b l o c k _ 2 ) , c r c2 ; Don't do this one yet
mov b l o c k _ 2 , b l o c k _ 0
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 4 ) Combine t h r e e r e s u l t s :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2020-04-22 17:16:40 +02:00
lea ( K _ t a b l e - 8 ) ( % r i p ) , % b u f p # f i r s t e n t r y i s f o r i d x 1
2012-09-27 15:44:22 -07:00
shlq $ 3 , % r a x # r a x * = 8
2020-04-22 17:16:40 +02:00
pmovzxdq ( % b u f p ,% r a x ) , % x m m 0 # 2 c o n s t s : K 1 : K 2
2014-06-06 23:08:58 -04:00
leal ( % e a x ,% e a x ,2 ) , % e a x # r a x * = 3 ( t o t a l * 2 4 )
subq % r a x , t m p # t m p - = r a x * 24
2012-09-27 15:44:22 -07:00
movq c r c _ i n i t , % x m m 1 # C R C f o r b l o c k 1
crypto: x86 - Remove include/asm/inst.h
Current minimum required version of binutils is 2.23,
which supports PSHUFB, PCLMULQDQ, PEXTRD, AESKEYGENASSIST,
AESIMC, AESENC, AESENCLAST, AESDEC, AESDECLAST and MOVQ
instruction mnemonics.
Substitute macros from include/asm/inst.h with a proper
instruction mnemonics in various assmbly files from
x86/crypto directory, and remove now unneeded file.
The patch was tested by calculating and comparing sha256sum
hashes of stripped object files before and after the patch,
to be sure that executable code didn't change.
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
CC: Herbert Xu <herbert@gondor.apana.org.au>
CC: "David S. Miller" <davem@davemloft.net>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: Borislav Petkov <bp@alien8.de>
CC: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2020-07-09 17:08:57 +02:00
pclmulqdq $ 0 x00 , % x m m 0 , % x m m 1 # M u l t i p l y b y K 2
2012-09-27 15:44:22 -07:00
movq c r c1 , % x m m 2 # C R C f o r b l o c k 2
crypto: x86 - Remove include/asm/inst.h
Current minimum required version of binutils is 2.23,
which supports PSHUFB, PCLMULQDQ, PEXTRD, AESKEYGENASSIST,
AESIMC, AESENC, AESENCLAST, AESDEC, AESDECLAST and MOVQ
instruction mnemonics.
Substitute macros from include/asm/inst.h with a proper
instruction mnemonics in various assmbly files from
x86/crypto directory, and remove now unneeded file.
The patch was tested by calculating and comparing sha256sum
hashes of stripped object files before and after the patch,
to be sure that executable code didn't change.
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
CC: Herbert Xu <herbert@gondor.apana.org.au>
CC: "David S. Miller" <davem@davemloft.net>
CC: Thomas Gleixner <tglx@linutronix.de>
CC: Ingo Molnar <mingo@redhat.com>
CC: Borislav Petkov <bp@alien8.de>
CC: "H. Peter Anvin" <hpa@zytor.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
2020-07-09 17:08:57 +02:00
pclmulqdq $ 0 x10 , % x m m 0 , % x m m 2 # M u l t i p l y b y K 1
2012-09-27 15:44:22 -07:00
pxor % x m m 2 ,% x m m 1
movq % x m m 1 , % r a x
xor - i * 8 ( b l o c k _ 2 ) , % r a x
mov c r c2 , c r c _ i n i t
crc3 2 % r a x , c r c _ i n i t
2014-06-06 23:08:58 -04:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 5 ) Check f o r e n d :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2012-09-27 15:44:22 -07:00
LABEL c r c _ 0
mov t m p , l e n
cmp $ 1 2 8 * 2 4 , t m p
jae f u l l _ b l o c k
cmp $ 2 4 , t m p
jae c o n t i n u e _ b l o c k
less_than_24 :
shl $ 3 2 - 4 , l e n _ d w # l e s s _ t h a n _ 16 e x p e c t s l e n g t h
# in u p p e r 4 b i t s o f l e n _ d w
jnc l e s s _ t h a n _ 1 6
crc3 2 q ( b u f p t m p ) , c r c _ i n i t
crc3 2 q 8 ( b u f p t m p ) , c r c _ i n i t
jz d o _ r e t u r n
add $ 1 6 , b u f p t m p
# len i s l e s s t h a n 8 i f w e g o t h e r e
# less_ t h a n _ 8 e x p e c t s l e n g t h i n u p p e r 3 b i t s o f l e n _ d w
# less_ t h a n _ 8 _ p o s t _ s h l 1 e x p e c t s l e n g t h = c a r r y f l a g * 8 + l e n _ d w [ 3 1 : 3 0 ]
shl $ 2 , l e n _ d w
jmp l e s s _ t h a n _ 8 _ p o s t _ s h l 1
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 6 ) LESS T H A N 2 5 6 - b y t e s R E M A I N A T T H I S P O I N T ( 8 - b i t s o f l e n a r e f u l l )
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
small :
shl $ 3 2 - 8 , l e n _ d w # P r e p a r e l e n _ d w f o r l e s s _ t h a n _ 256
j=256
.rept 5 # j = { 2 5 6 , 1 2 8 , 6 4 , 3 2 , 1 6 }
.altmacro
LABEL l e s s _ t h a n _ % j # l e s s _ t h a n _ j : L e n g t h s h o u l d b e i n
# upper l g ( j ) b i t s o f l e n _ d w
j= ( j / 2 )
shl $ 1 , l e n _ d w # G e t n e x t M S B
JNC_ L E S S _ T H A N % j
.noaltmacro
i=0
.rept ( j/ 8 )
crc3 2 q i ( b u f p t m p ) , c r c _ i n i t # C o m p u t e c r c 32 o f 8 - b y t e d a t a
i=i + 8
.endr
jz d o _ r e t u r n # R e t u r n i f r e m a i n i n g l e n g t h i s z e r o
add $ j , b u f p t m p # A d v a n c e b u f
.endr
less_than_8 : # Length s h o u l d b e s t o r e d i n
# upper 3 b i t s o f l e n _ d w
shl $ 1 , l e n _ d w
less_than_8_post_shl1 :
jnc l e s s _ t h a n _ 4
crc3 2 l ( b u f p t m p ) , c r c _ i n i t _ d w # C R C o f 4 b y t e s
jz d o _ r e t u r n # r e t u r n i f r e m a i n i n g d a t a i s z e r o
add $ 4 , b u f p t m p
less_than_4 : # Length s h o u l d b e s t o r e d i n
# upper 2 b i t s o f l e n _ d w
shl $ 1 , l e n _ d w
jnc l e s s _ t h a n _ 2
crc3 2 w ( b u f p t m p ) , c r c _ i n i t _ d w # C R C o f 2 b y t e s
jz d o _ r e t u r n # r e t u r n i f r e m a i n i n g d a t a i s z e r o
add $ 2 , b u f p t m p
less_than_2 : # Length s h o u l d b e s t o r e d i n t h e M S B
# of l e n _ d w
shl $ 1 , l e n _ d w
jnc l e s s _ t h a n _ 1
crc3 2 b ( b u f p t m p ) , c r c _ i n i t _ d w # C R C o f 1 b y t e
less_than_1 : # Length s h o u l d b e z e r o
do_return :
movq c r c _ i n i t , % r a x
popq % r s i
popq % r d i
popq % r b x
ret
2019-10-11 13:51:04 +02:00
SYM_ F U N C _ E N D ( c r c _ p c l )
2012-09-27 15:44:22 -07:00
2017-01-19 22:28:05 +01:00
.section .rodata , " a" , @progbits
2012-09-27 15:44:22 -07:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # jump t a b l e T a b l e i s 1 2 9 e n t r i e s x 2 b y t e s e a c h
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
.align 4
jump_table :
i=0
.rept 129
.altmacro
JMPTBL_ E N T R Y % i
.noaltmacro
i=i + 1
.endr
2013-01-19 13:39:21 +02:00
2012-09-27 15:44:22 -07:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # PCLMULQDQ t a b l e s
2014-06-06 23:08:58 -04:00
# # Table i s 1 2 8 e n t r i e s x 2 w o r d s ( 8 b y t e s ) e a c h
2012-09-27 15:44:22 -07:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
2014-06-06 23:08:58 -04:00
.align 8
2012-09-27 15:44:22 -07:00
K_table :
2014-06-06 23:08:58 -04:00
.long 0 x4 9 3 c7 d27 , 0 x00 0 0 0 0 0 1
.long 0 xba4 f c28 e , 0 x49 3 c7 d27
.long 0 xddc0 1 5 2 b , 0 x f20 c0 d f e
.long 0 x9 e 4 a d d f8 , 0 x b a4 f c28 e
.long 0 x3 9 d3 b29 6 , 0 x3 d a6 d0 c b
.long 0 x0 7 1 5 c e 5 3 , 0 x d d c01 5 2 b
.long 0 x4 7 d b83 1 7 , 0 x1 c29 1 d04
.long 0 x0 d3 b60 9 2 , 0 x9 e 4 a d d f8
.long 0 xc9 6 c f d c0 , 0 x74 0 e e f02
.long 0 x8 7 8 a92 a7 , 0 x39 d3 b29 6
.long 0 xdaece7 3 e , 0 x08 3 a6 e e c
.long 0 xab7 a f f2 a , 0 x07 1 5 c e 5 3
.long 0 x2 1 6 2 d38 5 , 0 x c49 f4 f67
.long 0 x8 3 3 4 8 8 3 2 , 0 x47 d b83 1 7
.long 0 x2 9 9 8 4 7 d5 , 0 x2 a d91 c30
.long 0 xb9 e 0 2 b86 , 0 x0 d3 b60 9 2
.long 0 x1 8 b33 a4 e , 0 x69 9 2 c e a2
.long 0 xb6 d d94 9 b , 0 x c96 c f d c0
.long 0 x7 8 d9 c c b7 , 0 x7 e 9 0 8 0 4 8
.long 0 xbac2 f d7 b , 0 x87 8 a92 a7
.long 0 xa6 0 c e 0 7 b , 0 x1 b3 d8 f29
.long 0 xce7 f39 f4 , 0 x d a e c e 7 3 e
.long 0 x6 1 d82 e 5 6 , 0 x f1 d0 f55 e
.long 0 xd2 7 0 f1 a2 , 0 x a b7 a f f2 a
.long 0 xc6 1 9 8 0 9 d , 0 x a87 a b8 a8
.long 0 x2 b3 c a c5 d , 0 x21 6 2 d38 5
.long 0 x6 5 8 6 3 b64 , 0 x84 6 2 d80 0
.long 0 x1 b03 3 9 7 f , 0 x83 3 4 8 8 3 2
.long 0 xebb8 8 3 b d , 0 x71 d11 1 a8
.long 0 xb3 e 3 2 c28 , 0 x29 9 8 4 7 d5
.long 0 x0 6 4 f7 f26 , 0 x f f d85 2 c6
.long 0 xdd7 e 3 b0 c , 0 x b9 e 0 2 b86
.long 0 xf2 8 5 6 5 1 c , 0 x d c b17 a a4
.long 0 x1 0 7 4 6 f3 c , 0 x18 b33 a4 e
.long 0 xc7 a68 8 5 5 , 0 x f37 c5 a e e
.long 0 x2 7 1 d98 4 4 , 0 x b6 d d94 9 b
.long 0 x8 e 7 6 6 a0 c , 0 x60 5 1 d5 a2
.long 0 x9 3 a5 f73 0 , 0 x78 d9 c c b7
.long 0 x6 c b08 e 5 c , 0 x18 b0 d4 f f
.long 0 x6 b74 9 f b2 , 0 x b a c2 f d7 b
.long 0 x1 3 9 3 e 2 0 3 , 0 x21 f3 d99 c
.long 0 xcec3 6 6 2 e , 0 x a60 c e 0 7 b
.long 0 x9 6 c51 5 b b , 0 x8 f15 8 0 1 4
.long 0 xe6 f c4 e 6 a , 0 x c e 7 f39 f4
.long 0 x8 2 2 7 b b8 a , 0 x a00 4 5 7 f7
.long 0 xb0 c d47 6 8 , 0 x61 d82 e 5 6
.long 0 x3 9 c7 f f35 , 0 x8 d6 d2 c43
.long 0 xd7 a48 2 5 c , 0 x d27 0 f1 a2
.long 0 x0 a b38 4 4 b , 0 x00 a c29 c f
.long 0 x0 1 6 7 d31 2 , 0 x c61 9 8 0 9 d
.long 0 xf6 0 7 6 5 4 4 , 0 x e 9 a d f79 6
.long 0 x2 6 f6 a60 a , 0 x2 b3 c a c5 d
.long 0 xa7 4 1 c1 b f , 0 x96 6 3 8 b34
.long 0 x9 8 d8 d9 c b , 0 x65 8 6 3 b64
.long 0 x4 9 c3 c c9 c , 0 x e 0 e 9 f35 1
.long 0 x6 8 b c e 8 7 a , 0 x1 b03 3 9 7 f
.long 0 x5 7 a3 d03 7 , 0 x9 a f01 f2 d
.long 0 x6 9 5 6 f c3 b , 0 x e b b88 3 b d
.long 0 x4 2 d98 8 8 8 , 0 x2 c f f42 c f
.long 0 x3 7 7 1 e 9 8 f , 0 x b3 e 3 2 c28
.long 0 xb4 2 a e 3 d9 , 0 x88 f25 a3 a
.long 0 x2 1 7 8 5 1 3 a , 0 x06 4 f7 f26
.long 0 xe0 a c13 9 e , 0 x4 e 3 6 f0 b0
.long 0 x1 7 0 0 7 6 f a , 0 x d d7 e 3 b0 c
.long 0 x4 4 4 d d41 3 , 0 x b d6 f81 f8
.long 0 x6 f34 5 e 4 5 , 0 x f28 5 6 5 1 c
.long 0 x4 1 d17 b64 , 0 x91 c9 b d4 b
.long 0 xff0 d b a97 , 0 x10 7 4 6 f3 c
.long 0 xa2 b73 d f1 , 0 x88 5 f08 7 b
.long 0 xf8 7 2 e 5 4 c , 0 x c7 a68 8 5 5
.long 0 x1 e 4 1 e 9 f c , 0 x4 c14 4 9 3 2
.long 0 x8 6 d8 e 4 d2 , 0 x27 1 d98 4 4
.long 0 x6 5 1 b d98 b , 0 x52 1 4 8 f02
.long 0 x5 b b8 f1 b c , 0 x8 e 7 6 6 a0 c
.long 0 xa9 0 f d27 a , 0 x a3 c6 f37 a
.long 0 xb3 a f07 7 a , 0 x93 a5 f73 0
.long 0 x4 9 8 4 d78 2 , 0 x d7 c05 5 7 f
.long 0 xca6 e f3 a c , 0 x6 c b08 e 5 c
.long 0 x2 3 4 e 0 b26 , 0 x63 d e d06 a
.long 0 xdd6 6 c b b b , 0 x6 b74 9 f b2
.long 0 x4 5 9 7 4 5 6 a , 0 x4 d56 9 7 3 c
.long 0 xe9 e 2 8 e b4 , 0 x13 9 3 e 2 0 3
.long 0 x7 b3 f f57 a , 0 x96 6 9 c9 d f
.long 0 xc9 c8 b78 2 , 0 x c e c36 6 2 e
.long 0 x3 f70 c c6 f , 0 x e 4 1 7 f38 a
.long 0 x9 3 e 1 0 6 a4 , 0 x96 c51 5 b b
.long 0 x6 2 e c6 c6 d , 0 x4 b9 e 0 f71
.long 0 xd8 1 3 b32 5 , 0 x e 6 f c4 e 6 a
.long 0 x0 d f04 6 8 0 , 0 x d10 4 b8 f c
.long 0 x2 3 4 2 0 0 1 e , 0 x82 2 7 b b8 a
.long 0 x0 a2 a8 d7 e , 0 x5 b39 7 7 3 0
.long 0 x6 d9 a49 5 7 , 0 x b0 c d47 6 8
.long 0 xe8 b63 6 8 b , 0 x e 7 8 e b41 6
.long 0 xd2 c3 e d1 a , 0 x39 c7 f f35
.long 0 x9 9 5 a57 2 4 , 0 x61 f f0 e 0 1
.long 0 x9 e f68 d35 , 0 x d7 a48 2 5 c
.long 0 x0 c13 9 b31 , 0 x8 d96 5 5 1 c
.long 0 xf2 2 7 1 e 6 0 , 0 x0 a b38 4 4 b
.long 0 x0 b0 b f8 c a , 0 x0 b f80 d d2
.long 0 x2 6 6 4 f d8 b , 0 x01 6 7 d31 2
.long 0 xed6 4 8 1 2 d , 0 x88 2 1 a b e d
.long 0 x0 2 e e 0 3 b2 , 0 x f60 7 6 5 4 4
.long 0 x8 6 0 4 a e 0 f , 0 x6 a45 d2 b2
.long 0 x3 6 3 b d6 b3 , 0 x26 f6 a60 a
.long 0 x1 3 5 c83 f d , 0 x d8 d26 6 1 9
.long 0 x5 f a b e 6 7 0 , 0 x a74 1 c1 b f
.long 0 x3 5 e c32 7 9 , 0 x d e 8 7 8 0 6 c
.long 0 x0 0 b c f5 f6 , 0 x98 d8 d9 c b
.long 0 x8 a e 0 0 6 8 9 , 0 x14 3 3 8 7 5 4
.long 0 x1 7 f27 6 9 8 , 0 x49 c3 c c9 c
.long 0 x5 8 c a5 f00 , 0 x5 b d20 1 1 f
.long 0 xaa7 c7 a d5 , 0 x68 b c e 8 7 a
.long 0 xb5 c f c a28 , 0 x d d07 4 4 8 e
.long 0 xded2 8 8 f8 , 0 x57 a3 d03 7
.long 0 x5 9 f22 9 b c , 0 x d d e 8 f5 b9
.long 0 x6 d39 0 d e c , 0 x69 5 6 f c3 b
.long 0 x3 7 1 7 0 3 9 0 , 0 x a3 e 3 e 0 2 c
.long 0 x6 3 5 3 c1 c c , 0 x42 d98 8 8 8
.long 0 xc4 5 8 4 f5 c , 0 x d73 c7 b e a
.long 0 xf4 8 6 4 2 e 9 , 0 x37 7 1 e 9 8 f
.long 0 x5 3 1 3 7 7 e 2 , 0 x80 f f00 9 3
.long 0 xdd3 5 b c8 d , 0 x b42 a e 3 d9
.long 0 xb2 5 b29 f2 , 0 x8 f e 4 c34 d
.long 0 x9 a5 e d e 4 1 , 0 x21 7 8 5 1 3 a
.long 0 xa5 6 3 9 0 5 d , 0 x d f99 f c11
.long 0 x4 5 c d d f4 e , 0 x e 0 a c13 9 e
.long 0 xacfa3 1 0 3 , 0 x6 c23 e 8 4 1
.long 0 xa5 1 b61 3 5 , 0 x17 0 0 7 6 f a