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-03-28 17:05:44 -07:00
# include < a s m / i n s t . h >
2013-01-19 13:39:21 +02:00
# include < l i n u x / l i n k a g e . h >
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
.word crc_ \ i - c r c _ a r r a y
.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 ) ;
2013-01-19 13:39:21 +02:00
ENTRY( c r c _ p c l )
2012-09-27 15:44:22 -07:00
# define b u f p % r d i
# 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 :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
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
# 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
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
# processing
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
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
dec b u f p
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
lea j u m p _ t a b l e ( % r i p ) , b u f p
movzxw ( b u f p , % r a x , 2 ) , l e n
offset=crc_array - j u m p _ t a b l e
lea o f f s e t ( b u f p , l e n , 1 ) , b u f p
jmp * b u f p
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 2 a) P R O C E S S F U L L B L O C K S :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
full_block :
movq $ 1 2 8 ,% r a x
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 :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
lea ( K _ t a b l e - 1 6 ) ( % 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
shlq $ 3 , % r a x # r a x * = 8
subq % r a x , t m p # t m p - = r a x * 8
shlq $ 1 , % r a x
subq % r a x , t m p # t m p - = r a x * 16
# ( total t m p - = r a x * 2 4 )
addq % r a x , b u f p
movdqa ( b u f p ) , % x m m 0 # 2 c o n s t s : K 1 : K 2
movq c r c _ i n i t , % x m m 1 # C R C f o r b l o c k 1
2013-03-28 17:05:44 -07: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
2013-03-28 17:05:44 -07: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
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 5 ) Check f o r e n d :
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
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
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # 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
ENDPROC( c r c _ p c l )
2012-09-27 15:44:22 -07:00
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # PCLMULQDQ t a b l e s
# # Table i s 1 2 8 e n t r i e s x 2 q u a d w o r d s e a c h
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
.data
.align 64
K_table :
.quad 0 x1 4 c d00 b d6 ,0 x10 5 e c76 f0
.quad 0 x0 b a4 f c28 e ,0 x14 c d00 b d6
.quad 0 x1 d82 c63 d a ,0 x0 f20 c0 d f e
.quad 0 x0 9 e 4 a d d f8 ,0 x0 b a4 f c28 e
.quad 0 x0 3 9 d3 b29 6 ,0 x13 8 4 a a63 a
.quad 0 x1 0 2 f9 b8 a2 ,0 x1 d82 c63 d a
.quad 0 x1 4 2 3 7 f5 e 6 ,0 x01 c29 1 d04
.quad 0 x0 0 d3 b60 9 2 ,0 x09 e 4 a d d f8
.quad 0 x0 c96 c f d c0 ,0 x07 4 0 e e f02
.quad 0 x1 8 2 6 6 e 4 5 6 ,0 x03 9 d3 b29 6
.quad 0 x0 d a e c e 7 3 e ,0 x00 8 3 a6 e e c
.quad 0 x0 a b7 a f f2 a ,0 x10 2 f9 b8 a2
.quad 0 x1 2 4 8 e a57 4 ,0 x1 c17 3 3 9 9 6
.quad 0 x0 8 3 3 4 8 8 3 2 ,0 x14 2 3 7 f5 e 6
.quad 0 x1 2 c74 3 1 2 4 ,0 x02 a d91 c30
.quad 0 x0 b9 e 0 2 b86 ,0 x00 d3 b60 9 2
.quad 0 x0 1 8 b33 a4 e ,0 x06 9 9 2 c e a2
.quad 0 x1 b33 1 e 2 6 a ,0 x0 c96 c f d c0
.quad 0 x1 7 d35 b a46 ,0 x07 e 9 0 8 0 4 8
.quad 0 x1 b f2 e 8 b8 a ,0 x18 2 6 6 e 4 5 6
.quad 0 x1 a3 e 0 9 6 8 a ,0 x11 e d1 f9 d8
.quad 0 x0 c e 7 f39 f4 ,0 x0 d a e c e 7 3 e
.quad 0 x0 6 1 d82 e 5 6 ,0 x0 f1 d0 f55 e
.quad 0 x0 d27 0 f1 a2 ,0 x0 a b7 a f f2 a
.quad 0 x1 c3 f5 f66 c ,0 x0 a87 a b8 a8
.quad 0 x1 2 e d0 d a a c ,0 x12 4 8 e a57 4
.quad 0 x0 6 5 8 6 3 b64 ,0 x08 4 6 2 d80 0
.quad 0 x1 1 e e f4 f8 e ,0 x08 3 3 4 8 8 3 2
.quad 0 x1 e e 5 4 f54 c ,0 x07 1 d11 1 a8
.quad 0 x0 b3 e 3 2 c28 ,0 x12 c74 3 1 2 4
.quad 0 x0 0 6 4 f7 f26 ,0 x0 f f d85 2 c6
.quad 0 x0 d d7 e 3 b0 c ,0 x0 b9 e 0 2 b86
.quad 0 x0 f28 5 6 5 1 c ,0 x0 d c b17 a a4
.quad 0 x0 1 0 7 4 6 f3 c ,0 x01 8 b33 a4 e
.quad 0 x1 c24 a f e a4 ,0 x0 f37 c5 a e e
.quad 0 x0 2 7 1 d98 4 4 ,0 x1 b33 1 e 2 6 a
.quad 0 x0 8 e 7 6 6 a0 c ,0 x06 0 5 1 d5 a2
.quad 0 x0 9 3 a5 f73 0 ,0 x17 d35 b a46
.quad 0 x0 6 c b08 e 5 c ,0 x11 d5 c a20 e
.quad 0 x0 6 b74 9 f b2 ,0 x1 b f2 e 8 b8 a
.quad 0 x1 1 6 7 f94 f2 ,0 x02 1 f3 d99 c
.quad 0 x0 c e c36 6 2 e ,0 x1 a3 e 0 9 6 8 a
.quad 0 x1 9 3 2 9 6 3 4 a ,0 x08 f15 8 0 1 4
.quad 0 x0 e 6 f c4 e 6 a ,0 x0 c e 7 f39 f4
.quad 0 x0 8 2 2 7 b b8 a ,0 x1 a5 e 8 2 1 0 6
.quad 0 x0 b0 c d47 6 8 ,0 x06 1 d82 e 5 6
.quad 0 x1 3 c2 b89 c4 ,0 x18 8 8 1 5 a b2
.quad 0 x0 d7 a48 2 5 c ,0 x0 d27 0 f1 a2
.quad 0 x1 0 f5 f f2 b a ,0 x10 5 4 0 5 f3 e
.quad 0 x0 0 1 6 7 d31 2 ,0 x1 c3 f5 f66 c
.quad 0 x0 f60 7 6 5 4 4 ,0 x0 e 9 a d f79 6
.quad 0 x0 2 6 f6 a60 a ,0 x12 e d0 d a a c
.quad 0 x1 a2 a d b74 e ,0 x09 6 6 3 8 b34
.quad 0 x1 9 d34 a f3 a ,0 x06 5 8 6 3 b64
.quad 0 x0 4 9 c3 c c9 c ,0 x1 e 5 0 5 8 5 a0
.quad 0 x0 6 8 b c e 8 7 a ,0 x11 e e f4 f8 e
.quad 0 x1 5 2 4 f a6 c6 ,0 x19 f1 c69 d c
.quad 0 x1 6 c b a8 a c a ,0 x1 e e 5 4 f54 c
.quad 0 x0 4 2 d98 8 8 8 ,0 x12 9 1 3 3 4 3 e
.quad 0 x1 3 2 9 d9 f7 e ,0 x0 b3 e 3 2 c28
.quad 0 x1 b1 c69 5 2 8 ,0 x08 8 f25 a3 a
.quad 0 x0 2 1 7 8 5 1 3 a ,0 x00 6 4 f7 f26
.quad 0 x0 e 0 a c13 9 e ,0 x04 e 3 6 f0 b0
.quad 0 x0 1 7 0 0 7 6 f a ,0 x0 d d7 e 3 b0 c
.quad 0 x1 4 1 a1 a2 e 2 ,0 x0 b d6 f81 f8
.quad 0 x1 6 a d82 8 b4 ,0 x0 f28 5 6 5 1 c
.quad 0 x0 4 1 d17 b64 ,0 x19 4 2 5 c b b a
.quad 0 x1 f a e 1 c c66 ,0 x01 0 7 4 6 f3 c
.quad 0 x1 a75 b4 b00 ,0 x18 d b37 e 8 a
.quad 0 x0 f87 2 e 5 4 c ,0 x1 c24 a f e a4
.quad 0 x0 1 e 4 1 e 9 f c ,0 x04 c14 4 9 3 2
.quad 0 x0 8 6 d8 e 4 d2 ,0 x02 7 1 d98 4 4
.quad 0 x1 6 0 f7 a f7 a ,0 x05 2 1 4 8 f02
.quad 0 x0 5 b b8 f1 b c ,0 x08 e 7 6 6 a0 c
.quad 0 x0 a90 f d27 a ,0 x0 a3 c6 f37 a
.quad 0 x0 b3 a f07 7 a ,0 x09 3 a5 f73 0
.quad 0 x0 4 9 8 4 d78 2 ,0 x1 d22 c23 8 e
.quad 0 x0 c a6 e f3 a c ,0 x06 c b08 e 5 c
.quad 0 x0 2 3 4 e 0 b26 ,0 x06 3 d e d06 a
.quad 0 x1 d88 a b d4 a ,0 x06 b74 9 f b2
.quad 0 x0 4 5 9 7 4 5 6 a ,0 x04 d56 9 7 3 c
.quad 0 x0 e 9 e 2 8 e b4 ,0 x11 6 7 f94 f2
.quad 0 x0 7 b3 f f57 a ,0 x19 3 8 5 b f2 e
.quad 0 x0 c9 c8 b78 2 ,0 x0 c e c36 6 2 e
.quad 0 x1 3 a9 c b a9 e ,0 x0 e 4 1 7 f38 a
.quad 0 x0 9 3 e 1 0 6 a4 ,0 x19 3 2 9 6 3 4 a
.quad 0 x1 6 7 0 0 1 a9 c ,0 x14 e 7 2 7 9 8 0
.quad 0 x1 d d f f c5 d4 ,0 x0 e 6 f c4 e 6 a
.quad 0 x0 0 d f04 6 8 0 ,0 x0 d10 4 b8 f c
.quad 0 x0 2 3 4 2 0 0 1 e ,0 x08 2 2 7 b b8 a
.quad 0 x0 0 a2 a8 d7 e ,0 x05 b39 7 7 3 0
.quad 0 x1 6 8 7 6 3 f a6 ,0 x0 b0 c d47 6 8
.quad 0 x1 e d5 a40 7 a ,0 x0 e 7 8 e b41 6
.quad 0 x0 d2 c3 e d1 a ,0 x13 c2 b89 c4
.quad 0 x0 9 9 5 a57 2 4 ,0 x16 4 1 3 7 8 f0
.quad 0 x1 9 b1 a f b c4 ,0 x0 d7 a48 2 5 c
.quad 0 x1 0 9 f f e d c0 ,0 x08 d96 5 5 1 c
.quad 0 x0 f22 7 1 e 6 0 ,0 x10 f5 f f2 b a
.quad 0 x0 0 b0 b f8 c a ,0 x00 b f80 d d2
.quad 0 x1 2 3 8 8 8 b7 a ,0 x00 1 6 7 d31 2
.quad 0 x1 e 8 8 8 f7 d c ,0 x18 d c d d d1 c
.quad 0 x0 0 2 e e 0 3 b2 ,0 x0 f60 7 6 5 4 4
.quad 0 x1 8 3 e 8 d8 f e ,0 x06 a45 d2 b2
.quad 0 x1 3 3 d7 a04 2 ,0 x02 6 f6 a60 a
.quad 0 x1 1 6 b0 f50 c ,0 x1 d d3 e 1 0 e 8
.quad 0 x0 5 f a b e 6 7 0 ,0 x1 a2 a d b74 e
.quad 0 x1 3 0 0 0 4 4 8 8 ,0 x0 d e 8 7 8 0 6 c
.quad 0 x0 0 0 b c f5 f6 ,0 x19 d34 a f3 a
.quad 0 x1 8 f0 c70 7 8 ,0 x01 4 3 3 8 7 5 4
.quad 0 x0 1 7 f27 6 9 8 ,0 x04 9 c3 c c9 c
.quad 0 x0 5 8 c a5 f00 ,0 x15 e 3 e 7 7 e e
.quad 0 x1 a f90 0 c24 ,0 x06 8 b c e 8 7 a
.quad 0 x0 b5 c f c a28 ,0 x0 d d07 4 4 8 e
.quad 0 x0 d e d28 8 f8 ,0 x15 2 4 f a6 c6
.quad 0 x0 5 9 f22 9 b c ,0 x1 d80 4 8 3 4 8
.quad 0 x0 6 d39 0 d e c ,0 x16 c b a8 a c a
.quad 0 x0 3 7 1 7 0 3 9 0 ,0 x0 a3 e 3 e 0 2 c
.quad 0 x0 6 3 5 3 c1 c c ,0 x04 2 d98 8 8 8
.quad 0 x0 c45 8 4 f5 c ,0 x0 d73 c7 b e a
.quad 0 x1 f16 a34 1 8 ,0 x13 2 9 d9 f7 e
.quad 0 x0 5 3 1 3 7 7 e 2 ,0 x18 5 1 3 7 6 6 2
.quad 0 x1 d8 d9 c a7 c ,0 x1 b1 c69 5 2 8
.quad 0 x0 b25 b29 f2 ,0 x18 a08 b5 b c
.quad 0 x1 9 f b2 a8 b0 ,0 x02 1 7 8 5 1 3 a
.quad 0 x1 a08 f e 6 a c ,0 x1 d a75 8 a e 0
.quad 0 x0 4 5 c d d f4 e ,0 x0 e 0 a c13 9 e
.quad 0 x1 a91 6 4 7 f2 ,0 x16 9 c f9 e b0
.quad 0 x1 a0 f71 7 c4 ,0 x01 7 0 0 7 6 f a