xref: /OK3568_Linux_fs/kernel/arch/x86/crypto/crc32c-pcl-intel-asm_64.S (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun/*
2*4882a593Smuzhiyun * Implement fast CRC32C with PCLMULQDQ instructions. (x86_64)
3*4882a593Smuzhiyun *
4*4882a593Smuzhiyun * The white papers on CRC32C calculations with PCLMULQDQ instruction can be
5*4882a593Smuzhiyun * downloaded from:
6*4882a593Smuzhiyun * http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/crc-iscsi-polynomial-crc32-instruction-paper.pdf
7*4882a593Smuzhiyun * http://www.intel.com/content/dam/www/public/us/en/documents/white-papers/fast-crc-computation-paper.pdf
8*4882a593Smuzhiyun *
9*4882a593Smuzhiyun * Copyright (C) 2012 Intel Corporation.
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Authors:
12*4882a593Smuzhiyun *	Wajdi Feghali <wajdi.k.feghali@intel.com>
13*4882a593Smuzhiyun *	James Guilford <james.guilford@intel.com>
14*4882a593Smuzhiyun *	David Cote <david.m.cote@intel.com>
15*4882a593Smuzhiyun *	Tim Chen <tim.c.chen@linux.intel.com>
16*4882a593Smuzhiyun *
17*4882a593Smuzhiyun * This software is available to you under a choice of one of two
18*4882a593Smuzhiyun * licenses.  You may choose to be licensed under the terms of the GNU
19*4882a593Smuzhiyun * General Public License (GPL) Version 2, available from the file
20*4882a593Smuzhiyun * COPYING in the main directory of this source tree, or the
21*4882a593Smuzhiyun * OpenIB.org BSD license below:
22*4882a593Smuzhiyun *
23*4882a593Smuzhiyun *     Redistribution and use in source and binary forms, with or
24*4882a593Smuzhiyun *     without modification, are permitted provided that the following
25*4882a593Smuzhiyun *     conditions are met:
26*4882a593Smuzhiyun *
27*4882a593Smuzhiyun *      - Redistributions of source code must retain the above
28*4882a593Smuzhiyun *        copyright notice, this list of conditions and the following
29*4882a593Smuzhiyun *        disclaimer.
30*4882a593Smuzhiyun *
31*4882a593Smuzhiyun *      - Redistributions in binary form must reproduce the above
32*4882a593Smuzhiyun *        copyright notice, this list of conditions and the following
33*4882a593Smuzhiyun *        disclaimer in the documentation and/or other materials
34*4882a593Smuzhiyun *        provided with the distribution.
35*4882a593Smuzhiyun *
36*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
37*4882a593Smuzhiyun * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
38*4882a593Smuzhiyun * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
39*4882a593Smuzhiyun * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
40*4882a593Smuzhiyun * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
41*4882a593Smuzhiyun * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
42*4882a593Smuzhiyun * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
43*4882a593Smuzhiyun * SOFTWARE.
44*4882a593Smuzhiyun */
45*4882a593Smuzhiyun
46*4882a593Smuzhiyun#include <linux/linkage.h>
47*4882a593Smuzhiyun#include <asm/nospec-branch.h>
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun## ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun.macro LABEL prefix n
52*4882a593Smuzhiyun\prefix\n\():
53*4882a593Smuzhiyun.endm
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun.macro JMPTBL_ENTRY i
56*4882a593Smuzhiyun.word crc_\i - crc_array
57*4882a593Smuzhiyun.endm
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun.macro JNC_LESS_THAN j
60*4882a593Smuzhiyun	jnc less_than_\j
61*4882a593Smuzhiyun.endm
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun# Define threshold where buffers are considered "small" and routed to more
64*4882a593Smuzhiyun# efficient "by-1" code. This "by-1" code only handles up to 255 bytes, so
65*4882a593Smuzhiyun# SMALL_SIZE can be no larger than 255.
66*4882a593Smuzhiyun
67*4882a593Smuzhiyun#define SMALL_SIZE 200
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun.if (SMALL_SIZE > 255)
70*4882a593Smuzhiyun.error "SMALL_ SIZE must be < 256"
71*4882a593Smuzhiyun.endif
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun# unsigned int crc_pcl(u8 *buffer, int len, unsigned int crc_init);
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun.text
76*4882a593SmuzhiyunSYM_FUNC_START(crc_pcl)
77*4882a593Smuzhiyun#define    bufp		rdi
78*4882a593Smuzhiyun#define    bufp_dw	%edi
79*4882a593Smuzhiyun#define    bufp_w	%di
80*4882a593Smuzhiyun#define    bufp_b	%dil
81*4882a593Smuzhiyun#define    bufptmp	%rcx
82*4882a593Smuzhiyun#define    block_0	%rcx
83*4882a593Smuzhiyun#define    block_1	%rdx
84*4882a593Smuzhiyun#define    block_2	%r11
85*4882a593Smuzhiyun#define    len		%rsi
86*4882a593Smuzhiyun#define    len_dw	%esi
87*4882a593Smuzhiyun#define    len_w	%si
88*4882a593Smuzhiyun#define    len_b	%sil
89*4882a593Smuzhiyun#define    crc_init_arg %rdx
90*4882a593Smuzhiyun#define    tmp		%rbx
91*4882a593Smuzhiyun#define    crc_init	%r8
92*4882a593Smuzhiyun#define    crc_init_dw	%r8d
93*4882a593Smuzhiyun#define    crc1		%r9
94*4882a593Smuzhiyun#define    crc2		%r10
95*4882a593Smuzhiyun
96*4882a593Smuzhiyun	pushq   %rbx
97*4882a593Smuzhiyun	pushq   %rdi
98*4882a593Smuzhiyun	pushq   %rsi
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun	## Move crc_init for Linux to a different
101*4882a593Smuzhiyun	mov     crc_init_arg, crc_init
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun	################################################################
104*4882a593Smuzhiyun	## 1) ALIGN:
105*4882a593Smuzhiyun	################################################################
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun	mov     %bufp, bufptmp		# rdi = *buf
108*4882a593Smuzhiyun	neg     %bufp
109*4882a593Smuzhiyun	and     $7, %bufp		# calculate the unalignment amount of
110*4882a593Smuzhiyun					# the address
111*4882a593Smuzhiyun	je      proc_block		# Skip if aligned
112*4882a593Smuzhiyun
113*4882a593Smuzhiyun	## If len is less than 8 and we're unaligned, we need to jump
114*4882a593Smuzhiyun	## to special code to avoid reading beyond the end of the buffer
115*4882a593Smuzhiyun	cmp     $8, len
116*4882a593Smuzhiyun	jae     do_align
117*4882a593Smuzhiyun	# less_than_8 expects length in upper 3 bits of len_dw
118*4882a593Smuzhiyun	# less_than_8_post_shl1 expects length = carryflag * 8 + len_dw[31:30]
119*4882a593Smuzhiyun	shl     $32-3+1, len_dw
120*4882a593Smuzhiyun	jmp     less_than_8_post_shl1
121*4882a593Smuzhiyun
122*4882a593Smuzhiyundo_align:
123*4882a593Smuzhiyun	#### Calculate CRC of unaligned bytes of the buffer (if any)
124*4882a593Smuzhiyun	movq    (bufptmp), tmp		# load a quadward from the buffer
125*4882a593Smuzhiyun	add     %bufp, bufptmp		# align buffer pointer for quadword
126*4882a593Smuzhiyun					# processing
127*4882a593Smuzhiyun	sub     %bufp, len		# update buffer length
128*4882a593Smuzhiyunalign_loop:
129*4882a593Smuzhiyun	crc32b  %bl, crc_init_dw 	# compute crc32 of 1-byte
130*4882a593Smuzhiyun	shr     $8, tmp			# get next byte
131*4882a593Smuzhiyun	dec     %bufp
132*4882a593Smuzhiyun	jne     align_loop
133*4882a593Smuzhiyun
134*4882a593Smuzhiyunproc_block:
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun	################################################################
137*4882a593Smuzhiyun	## 2) PROCESS  BLOCKS:
138*4882a593Smuzhiyun	################################################################
139*4882a593Smuzhiyun
140*4882a593Smuzhiyun	## compute num of bytes to be processed
141*4882a593Smuzhiyun	movq    len, tmp		# save num bytes in tmp
142*4882a593Smuzhiyun
143*4882a593Smuzhiyun	cmpq    $128*24, len
144*4882a593Smuzhiyun	jae     full_block
145*4882a593Smuzhiyun
146*4882a593Smuzhiyuncontinue_block:
147*4882a593Smuzhiyun	cmpq    $SMALL_SIZE, len
148*4882a593Smuzhiyun	jb      small
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun	## len < 128*24
151*4882a593Smuzhiyun	movq    $2731, %rax		# 2731 = ceil(2^16 / 24)
152*4882a593Smuzhiyun	mul     len_dw
153*4882a593Smuzhiyun	shrq    $16, %rax
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun	## eax contains floor(bytes / 24) = num 24-byte chunks to do
156*4882a593Smuzhiyun
157*4882a593Smuzhiyun	## process rax 24-byte chunks (128 >= rax >= 0)
158*4882a593Smuzhiyun
159*4882a593Smuzhiyun	## compute end address of each block
160*4882a593Smuzhiyun	## block 0 (base addr + RAX * 8)
161*4882a593Smuzhiyun	## block 1 (base addr + RAX * 16)
162*4882a593Smuzhiyun	## block 2 (base addr + RAX * 24)
163*4882a593Smuzhiyun	lea     (bufptmp, %rax, 8), block_0
164*4882a593Smuzhiyun	lea     (block_0, %rax, 8), block_1
165*4882a593Smuzhiyun	lea     (block_1, %rax, 8), block_2
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun	xor     crc1, crc1
168*4882a593Smuzhiyun	xor     crc2, crc2
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun	## branch into array
171*4882a593Smuzhiyun	lea	jump_table(%rip), %bufp
172*4882a593Smuzhiyun	movzwq  (%bufp, %rax, 2), len
173*4882a593Smuzhiyun	lea	crc_array(%rip), %bufp
174*4882a593Smuzhiyun	lea     (%bufp, len, 1), %bufp
175*4882a593Smuzhiyun	JMP_NOSPEC bufp
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun	################################################################
178*4882a593Smuzhiyun	## 2a) PROCESS FULL BLOCKS:
179*4882a593Smuzhiyun	################################################################
180*4882a593Smuzhiyunfull_block:
181*4882a593Smuzhiyun	movl    $128,%eax
182*4882a593Smuzhiyun	lea     128*8*2(block_0), block_1
183*4882a593Smuzhiyun	lea     128*8*3(block_0), block_2
184*4882a593Smuzhiyun	add     $128*8*1, block_0
185*4882a593Smuzhiyun
186*4882a593Smuzhiyun	xor     crc1,crc1
187*4882a593Smuzhiyun	xor     crc2,crc2
188*4882a593Smuzhiyun
189*4882a593Smuzhiyun	# Fall thruogh into top of crc array (crc_128)
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun	################################################################
192*4882a593Smuzhiyun	## 3) CRC Array:
193*4882a593Smuzhiyun	################################################################
194*4882a593Smuzhiyun
195*4882a593Smuzhiyuncrc_array:
196*4882a593Smuzhiyun	i=128
197*4882a593Smuzhiyun.rept 128-1
198*4882a593Smuzhiyun.altmacro
199*4882a593SmuzhiyunLABEL crc_ %i
200*4882a593Smuzhiyun.noaltmacro
201*4882a593Smuzhiyun	crc32q   -i*8(block_0), crc_init
202*4882a593Smuzhiyun	crc32q   -i*8(block_1), crc1
203*4882a593Smuzhiyun	crc32q   -i*8(block_2), crc2
204*4882a593Smuzhiyun	i=(i-1)
205*4882a593Smuzhiyun.endr
206*4882a593Smuzhiyun
207*4882a593Smuzhiyun.altmacro
208*4882a593SmuzhiyunLABEL crc_ %i
209*4882a593Smuzhiyun.noaltmacro
210*4882a593Smuzhiyun	crc32q   -i*8(block_0), crc_init
211*4882a593Smuzhiyun	crc32q   -i*8(block_1), crc1
212*4882a593Smuzhiyun# SKIP  crc32  -i*8(block_2), crc2 ; Don't do this one yet
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun	mov     block_2, block_0
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun	################################################################
217*4882a593Smuzhiyun	## 4) Combine three results:
218*4882a593Smuzhiyun	################################################################
219*4882a593Smuzhiyun
220*4882a593Smuzhiyun	lea	(K_table-8)(%rip), %bufp		# first entry is for idx 1
221*4882a593Smuzhiyun	shlq    $3, %rax			# rax *= 8
222*4882a593Smuzhiyun	pmovzxdq (%bufp,%rax), %xmm0		# 2 consts: K1:K2
223*4882a593Smuzhiyun	leal	(%eax,%eax,2), %eax		# rax *= 3 (total *24)
224*4882a593Smuzhiyun	subq    %rax, tmp			# tmp -= rax*24
225*4882a593Smuzhiyun
226*4882a593Smuzhiyun	movq    crc_init, %xmm1			# CRC for block 1
227*4882a593Smuzhiyun	pclmulqdq $0x00, %xmm0, %xmm1		# Multiply by K2
228*4882a593Smuzhiyun
229*4882a593Smuzhiyun	movq    crc1, %xmm2			# CRC for block 2
230*4882a593Smuzhiyun	pclmulqdq $0x10, %xmm0, %xmm2		# Multiply by K1
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun	pxor    %xmm2,%xmm1
233*4882a593Smuzhiyun	movq    %xmm1, %rax
234*4882a593Smuzhiyun	xor     -i*8(block_2), %rax
235*4882a593Smuzhiyun	mov     crc2, crc_init
236*4882a593Smuzhiyun	crc32   %rax, crc_init
237*4882a593Smuzhiyun
238*4882a593Smuzhiyun	################################################################
239*4882a593Smuzhiyun	## 5) Check for end:
240*4882a593Smuzhiyun	################################################################
241*4882a593Smuzhiyun
242*4882a593SmuzhiyunLABEL crc_ 0
243*4882a593Smuzhiyun	mov     tmp, len
244*4882a593Smuzhiyun	cmp     $128*24, tmp
245*4882a593Smuzhiyun	jae     full_block
246*4882a593Smuzhiyun	cmp     $24, tmp
247*4882a593Smuzhiyun	jae     continue_block
248*4882a593Smuzhiyun
249*4882a593Smuzhiyunless_than_24:
250*4882a593Smuzhiyun	shl     $32-4, len_dw			# less_than_16 expects length
251*4882a593Smuzhiyun						# in upper 4 bits of len_dw
252*4882a593Smuzhiyun	jnc     less_than_16
253*4882a593Smuzhiyun	crc32q  (bufptmp), crc_init
254*4882a593Smuzhiyun	crc32q  8(bufptmp), crc_init
255*4882a593Smuzhiyun	jz      do_return
256*4882a593Smuzhiyun	add     $16, bufptmp
257*4882a593Smuzhiyun	# len is less than 8 if we got here
258*4882a593Smuzhiyun	# less_than_8 expects length in upper 3 bits of len_dw
259*4882a593Smuzhiyun	# less_than_8_post_shl1 expects length = carryflag * 8 + len_dw[31:30]
260*4882a593Smuzhiyun	shl     $2, len_dw
261*4882a593Smuzhiyun	jmp     less_than_8_post_shl1
262*4882a593Smuzhiyun
263*4882a593Smuzhiyun	#######################################################################
264*4882a593Smuzhiyun	## 6) LESS THAN 256-bytes REMAIN AT THIS POINT (8-bits of len are full)
265*4882a593Smuzhiyun	#######################################################################
266*4882a593Smuzhiyunsmall:
267*4882a593Smuzhiyun	shl $32-8, len_dw		# Prepare len_dw for less_than_256
268*4882a593Smuzhiyun	j=256
269*4882a593Smuzhiyun.rept 5					# j = {256, 128, 64, 32, 16}
270*4882a593Smuzhiyun.altmacro
271*4882a593SmuzhiyunLABEL less_than_ %j			# less_than_j: Length should be in
272*4882a593Smuzhiyun					# upper lg(j) bits of len_dw
273*4882a593Smuzhiyun	j=(j/2)
274*4882a593Smuzhiyun	shl     $1, len_dw		# Get next MSB
275*4882a593Smuzhiyun	JNC_LESS_THAN %j
276*4882a593Smuzhiyun.noaltmacro
277*4882a593Smuzhiyun	i=0
278*4882a593Smuzhiyun.rept (j/8)
279*4882a593Smuzhiyun	crc32q  i(bufptmp), crc_init	# Compute crc32 of 8-byte data
280*4882a593Smuzhiyun	i=i+8
281*4882a593Smuzhiyun.endr
282*4882a593Smuzhiyun	jz      do_return		# Return if remaining length is zero
283*4882a593Smuzhiyun	add     $j, bufptmp		# Advance buf
284*4882a593Smuzhiyun.endr
285*4882a593Smuzhiyun
286*4882a593Smuzhiyunless_than_8:				# Length should be stored in
287*4882a593Smuzhiyun					# upper 3 bits of len_dw
288*4882a593Smuzhiyun	shl     $1, len_dw
289*4882a593Smuzhiyunless_than_8_post_shl1:
290*4882a593Smuzhiyun	jnc     less_than_4
291*4882a593Smuzhiyun	crc32l  (bufptmp), crc_init_dw	# CRC of 4 bytes
292*4882a593Smuzhiyun	jz      do_return		# return if remaining data is zero
293*4882a593Smuzhiyun	add     $4, bufptmp
294*4882a593Smuzhiyunless_than_4:				# Length should be stored in
295*4882a593Smuzhiyun					# upper 2 bits of len_dw
296*4882a593Smuzhiyun	shl     $1, len_dw
297*4882a593Smuzhiyun	jnc     less_than_2
298*4882a593Smuzhiyun	crc32w  (bufptmp), crc_init_dw	# CRC of 2 bytes
299*4882a593Smuzhiyun	jz      do_return		# return if remaining data is zero
300*4882a593Smuzhiyun	add     $2, bufptmp
301*4882a593Smuzhiyunless_than_2:				# Length should be stored in the MSB
302*4882a593Smuzhiyun					# of len_dw
303*4882a593Smuzhiyun	shl     $1, len_dw
304*4882a593Smuzhiyun	jnc     less_than_1
305*4882a593Smuzhiyun	crc32b  (bufptmp), crc_init_dw	# CRC of 1 byte
306*4882a593Smuzhiyunless_than_1:				# Length should be zero
307*4882a593Smuzhiyundo_return:
308*4882a593Smuzhiyun	movq    crc_init, %rax
309*4882a593Smuzhiyun	popq    %rsi
310*4882a593Smuzhiyun	popq    %rdi
311*4882a593Smuzhiyun	popq    %rbx
312*4882a593Smuzhiyun        RET
313*4882a593SmuzhiyunSYM_FUNC_END(crc_pcl)
314*4882a593Smuzhiyun
315*4882a593Smuzhiyun.section	.rodata, "a", @progbits
316*4882a593Smuzhiyun        ################################################################
317*4882a593Smuzhiyun        ## jump table        Table is 129 entries x 2 bytes each
318*4882a593Smuzhiyun        ################################################################
319*4882a593Smuzhiyun.align 4
320*4882a593Smuzhiyunjump_table:
321*4882a593Smuzhiyun	i=0
322*4882a593Smuzhiyun.rept 129
323*4882a593Smuzhiyun.altmacro
324*4882a593SmuzhiyunJMPTBL_ENTRY %i
325*4882a593Smuzhiyun.noaltmacro
326*4882a593Smuzhiyun	i=i+1
327*4882a593Smuzhiyun.endr
328*4882a593Smuzhiyun
329*4882a593Smuzhiyun
330*4882a593Smuzhiyun	################################################################
331*4882a593Smuzhiyun	## PCLMULQDQ tables
332*4882a593Smuzhiyun	## Table is 128 entries x 2 words (8 bytes) each
333*4882a593Smuzhiyun	################################################################
334*4882a593Smuzhiyun.align 8
335*4882a593SmuzhiyunK_table:
336*4882a593Smuzhiyun	.long 0x493c7d27, 0x00000001
337*4882a593Smuzhiyun	.long 0xba4fc28e, 0x493c7d27
338*4882a593Smuzhiyun	.long 0xddc0152b, 0xf20c0dfe
339*4882a593Smuzhiyun	.long 0x9e4addf8, 0xba4fc28e
340*4882a593Smuzhiyun	.long 0x39d3b296, 0x3da6d0cb
341*4882a593Smuzhiyun	.long 0x0715ce53, 0xddc0152b
342*4882a593Smuzhiyun	.long 0x47db8317, 0x1c291d04
343*4882a593Smuzhiyun	.long 0x0d3b6092, 0x9e4addf8
344*4882a593Smuzhiyun	.long 0xc96cfdc0, 0x740eef02
345*4882a593Smuzhiyun	.long 0x878a92a7, 0x39d3b296
346*4882a593Smuzhiyun	.long 0xdaece73e, 0x083a6eec
347*4882a593Smuzhiyun	.long 0xab7aff2a, 0x0715ce53
348*4882a593Smuzhiyun	.long 0x2162d385, 0xc49f4f67
349*4882a593Smuzhiyun	.long 0x83348832, 0x47db8317
350*4882a593Smuzhiyun	.long 0x299847d5, 0x2ad91c30
351*4882a593Smuzhiyun	.long 0xb9e02b86, 0x0d3b6092
352*4882a593Smuzhiyun	.long 0x18b33a4e, 0x6992cea2
353*4882a593Smuzhiyun	.long 0xb6dd949b, 0xc96cfdc0
354*4882a593Smuzhiyun	.long 0x78d9ccb7, 0x7e908048
355*4882a593Smuzhiyun	.long 0xbac2fd7b, 0x878a92a7
356*4882a593Smuzhiyun	.long 0xa60ce07b, 0x1b3d8f29
357*4882a593Smuzhiyun	.long 0xce7f39f4, 0xdaece73e
358*4882a593Smuzhiyun	.long 0x61d82e56, 0xf1d0f55e
359*4882a593Smuzhiyun	.long 0xd270f1a2, 0xab7aff2a
360*4882a593Smuzhiyun	.long 0xc619809d, 0xa87ab8a8
361*4882a593Smuzhiyun	.long 0x2b3cac5d, 0x2162d385
362*4882a593Smuzhiyun	.long 0x65863b64, 0x8462d800
363*4882a593Smuzhiyun	.long 0x1b03397f, 0x83348832
364*4882a593Smuzhiyun	.long 0xebb883bd, 0x71d111a8
365*4882a593Smuzhiyun	.long 0xb3e32c28, 0x299847d5
366*4882a593Smuzhiyun	.long 0x064f7f26, 0xffd852c6
367*4882a593Smuzhiyun	.long 0xdd7e3b0c, 0xb9e02b86
368*4882a593Smuzhiyun	.long 0xf285651c, 0xdcb17aa4
369*4882a593Smuzhiyun	.long 0x10746f3c, 0x18b33a4e
370*4882a593Smuzhiyun	.long 0xc7a68855, 0xf37c5aee
371*4882a593Smuzhiyun	.long 0x271d9844, 0xb6dd949b
372*4882a593Smuzhiyun	.long 0x8e766a0c, 0x6051d5a2
373*4882a593Smuzhiyun	.long 0x93a5f730, 0x78d9ccb7
374*4882a593Smuzhiyun	.long 0x6cb08e5c, 0x18b0d4ff
375*4882a593Smuzhiyun	.long 0x6b749fb2, 0xbac2fd7b
376*4882a593Smuzhiyun	.long 0x1393e203, 0x21f3d99c
377*4882a593Smuzhiyun	.long 0xcec3662e, 0xa60ce07b
378*4882a593Smuzhiyun	.long 0x96c515bb, 0x8f158014
379*4882a593Smuzhiyun	.long 0xe6fc4e6a, 0xce7f39f4
380*4882a593Smuzhiyun	.long 0x8227bb8a, 0xa00457f7
381*4882a593Smuzhiyun	.long 0xb0cd4768, 0x61d82e56
382*4882a593Smuzhiyun	.long 0x39c7ff35, 0x8d6d2c43
383*4882a593Smuzhiyun	.long 0xd7a4825c, 0xd270f1a2
384*4882a593Smuzhiyun	.long 0x0ab3844b, 0x00ac29cf
385*4882a593Smuzhiyun	.long 0x0167d312, 0xc619809d
386*4882a593Smuzhiyun	.long 0xf6076544, 0xe9adf796
387*4882a593Smuzhiyun	.long 0x26f6a60a, 0x2b3cac5d
388*4882a593Smuzhiyun	.long 0xa741c1bf, 0x96638b34
389*4882a593Smuzhiyun	.long 0x98d8d9cb, 0x65863b64
390*4882a593Smuzhiyun	.long 0x49c3cc9c, 0xe0e9f351
391*4882a593Smuzhiyun	.long 0x68bce87a, 0x1b03397f
392*4882a593Smuzhiyun	.long 0x57a3d037, 0x9af01f2d
393*4882a593Smuzhiyun	.long 0x6956fc3b, 0xebb883bd
394*4882a593Smuzhiyun	.long 0x42d98888, 0x2cff42cf
395*4882a593Smuzhiyun	.long 0x3771e98f, 0xb3e32c28
396*4882a593Smuzhiyun	.long 0xb42ae3d9, 0x88f25a3a
397*4882a593Smuzhiyun	.long 0x2178513a, 0x064f7f26
398*4882a593Smuzhiyun	.long 0xe0ac139e, 0x4e36f0b0
399*4882a593Smuzhiyun	.long 0x170076fa, 0xdd7e3b0c
400*4882a593Smuzhiyun	.long 0x444dd413, 0xbd6f81f8
401*4882a593Smuzhiyun	.long 0x6f345e45, 0xf285651c
402*4882a593Smuzhiyun	.long 0x41d17b64, 0x91c9bd4b
403*4882a593Smuzhiyun	.long 0xff0dba97, 0x10746f3c
404*4882a593Smuzhiyun	.long 0xa2b73df1, 0x885f087b
405*4882a593Smuzhiyun	.long 0xf872e54c, 0xc7a68855
406*4882a593Smuzhiyun	.long 0x1e41e9fc, 0x4c144932
407*4882a593Smuzhiyun	.long 0x86d8e4d2, 0x271d9844
408*4882a593Smuzhiyun	.long 0x651bd98b, 0x52148f02
409*4882a593Smuzhiyun	.long 0x5bb8f1bc, 0x8e766a0c
410*4882a593Smuzhiyun	.long 0xa90fd27a, 0xa3c6f37a
411*4882a593Smuzhiyun	.long 0xb3af077a, 0x93a5f730
412*4882a593Smuzhiyun	.long 0x4984d782, 0xd7c0557f
413*4882a593Smuzhiyun	.long 0xca6ef3ac, 0x6cb08e5c
414*4882a593Smuzhiyun	.long 0x234e0b26, 0x63ded06a
415*4882a593Smuzhiyun	.long 0xdd66cbbb, 0x6b749fb2
416*4882a593Smuzhiyun	.long 0x4597456a, 0x4d56973c
417*4882a593Smuzhiyun	.long 0xe9e28eb4, 0x1393e203
418*4882a593Smuzhiyun	.long 0x7b3ff57a, 0x9669c9df
419*4882a593Smuzhiyun	.long 0xc9c8b782, 0xcec3662e
420*4882a593Smuzhiyun	.long 0x3f70cc6f, 0xe417f38a
421*4882a593Smuzhiyun	.long 0x93e106a4, 0x96c515bb
422*4882a593Smuzhiyun	.long 0x62ec6c6d, 0x4b9e0f71
423*4882a593Smuzhiyun	.long 0xd813b325, 0xe6fc4e6a
424*4882a593Smuzhiyun	.long 0x0df04680, 0xd104b8fc
425*4882a593Smuzhiyun	.long 0x2342001e, 0x8227bb8a
426*4882a593Smuzhiyun	.long 0x0a2a8d7e, 0x5b397730
427*4882a593Smuzhiyun	.long 0x6d9a4957, 0xb0cd4768
428*4882a593Smuzhiyun	.long 0xe8b6368b, 0xe78eb416
429*4882a593Smuzhiyun	.long 0xd2c3ed1a, 0x39c7ff35
430*4882a593Smuzhiyun	.long 0x995a5724, 0x61ff0e01
431*4882a593Smuzhiyun	.long 0x9ef68d35, 0xd7a4825c
432*4882a593Smuzhiyun	.long 0x0c139b31, 0x8d96551c
433*4882a593Smuzhiyun	.long 0xf2271e60, 0x0ab3844b
434*4882a593Smuzhiyun	.long 0x0b0bf8ca, 0x0bf80dd2
435*4882a593Smuzhiyun	.long 0x2664fd8b, 0x0167d312
436*4882a593Smuzhiyun	.long 0xed64812d, 0x8821abed
437*4882a593Smuzhiyun	.long 0x02ee03b2, 0xf6076544
438*4882a593Smuzhiyun	.long 0x8604ae0f, 0x6a45d2b2
439*4882a593Smuzhiyun	.long 0x363bd6b3, 0x26f6a60a
440*4882a593Smuzhiyun	.long 0x135c83fd, 0xd8d26619
441*4882a593Smuzhiyun	.long 0x5fabe670, 0xa741c1bf
442*4882a593Smuzhiyun	.long 0x35ec3279, 0xde87806c
443*4882a593Smuzhiyun	.long 0x00bcf5f6, 0x98d8d9cb
444*4882a593Smuzhiyun	.long 0x8ae00689, 0x14338754
445*4882a593Smuzhiyun	.long 0x17f27698, 0x49c3cc9c
446*4882a593Smuzhiyun	.long 0x58ca5f00, 0x5bd2011f
447*4882a593Smuzhiyun	.long 0xaa7c7ad5, 0x68bce87a
448*4882a593Smuzhiyun	.long 0xb5cfca28, 0xdd07448e
449*4882a593Smuzhiyun	.long 0xded288f8, 0x57a3d037
450*4882a593Smuzhiyun	.long 0x59f229bc, 0xdde8f5b9
451*4882a593Smuzhiyun	.long 0x6d390dec, 0x6956fc3b
452*4882a593Smuzhiyun	.long 0x37170390, 0xa3e3e02c
453*4882a593Smuzhiyun	.long 0x6353c1cc, 0x42d98888
454*4882a593Smuzhiyun	.long 0xc4584f5c, 0xd73c7bea
455*4882a593Smuzhiyun	.long 0xf48642e9, 0x3771e98f
456*4882a593Smuzhiyun	.long 0x531377e2, 0x80ff0093
457*4882a593Smuzhiyun	.long 0xdd35bc8d, 0xb42ae3d9
458*4882a593Smuzhiyun	.long 0xb25b29f2, 0x8fe4c34d
459*4882a593Smuzhiyun	.long 0x9a5ede41, 0x2178513a
460*4882a593Smuzhiyun	.long 0xa563905d, 0xdf99fc11
461*4882a593Smuzhiyun	.long 0x45cddf4e, 0xe0ac139e
462*4882a593Smuzhiyun	.long 0xacfa3103, 0x6c23e841
463*4882a593Smuzhiyun	.long 0xa51b6135, 0x170076fa
464