xref: /isa-l/crc/crc32_iscsi_01.asm (revision 11542000f0bf653f6615a7742948aac7ca3d46a7)
1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2;  Copyright(c) 2011-2015 Intel Corporation All rights reserved.
3;
4;  Redistribution and use in source and binary forms, with or without
5;  modification, are permitted provided that the following conditions
6;  are met:
7;    * Redistributions of source code must retain the above copyright
8;      notice, this list of conditions and the following disclaimer.
9;    * Redistributions in binary form must reproduce the above copyright
10;      notice, this list of conditions and the following disclaimer in
11;      the documentation and/or other materials provided with the
12;      distribution.
13;    * Neither the name of Intel Corporation nor the names of its
14;      contributors may be used to endorse or promote products derived
15;      from this software without specific prior written permission.
16;
17;  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18;  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19;  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20;  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21;  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22;  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23;  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24;  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25;  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26;  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27;  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
29
30;;; ISCSI CRC 32 Implementation with crc32 and pclmulqdq Instruction
31
32%include "reg_sizes.asm"
33
34default rel
35%define CONCAT(a,b,c)   a %+ b %+ c
36
37; Define threshold where buffers are considered "small" and routed to more
38; efficient "by-1" code. This "by-1" code only handles up to 255 bytes, so
39; SMALL_SIZE can be no larger than 256.
40%define SMALL_SIZE 200
41
42%if (SMALL_SIZE > 256)
43%error SMALL_ SIZE must be <= 256
44% error ; needed because '%error' actually generates only a warning
45%endif
46
47;;; unsigned int crc32_iscsi_01(unsigned char * buffer, int len, unsigned int crc_init);
48;;;
49;;;        *buf = rcx
50;;;         len = rdx
51;;;    crc_init = r8
52
53global  crc32_iscsi_01:function
54crc32_iscsi_01:
55
56%ifidn __OUTPUT_FORMAT__, elf64
57%define bufp            rdi
58%define bufp_dw         edi
59%define bufp_w          di
60%define bufp_b          dil
61%define bufptmp         rcx
62%define block_0         rcx
63%define block_1         rdx
64%define block_2         r11
65%define len             rsi
66%define len_dw          esi
67%define len_w           si
68%define len_b           sil
69%define crc_init_arg    rdx
70%else
71%define bufp            rcx
72%define bufp_dw         ecx
73%define bufp_w          cx
74%define bufp_b          cl
75%define bufptmp         rdi
76%define block_0         rdi
77%define block_1         rsi
78%define block_2         r11
79%define len             rdx
80%define len_dw          edx
81%define len_w           dx
82%define len_b           dl
83%endif
84
85%define tmp             rbx
86%define crc_init        r8
87%define crc_init_dw     r8d
88%define crc1            r9
89%define crc2            r10
90
91	push	rbx
92	push	rdi
93	push	rsi
94
95	;; Move crc_init for Linux to a different reg
96%ifidn __OUTPUT_FORMAT__, elf64
97	mov	crc_init, crc_init_arg
98%endif
99
100	;; If len is less than 8 we need to jump to special code to avoid
101	;; reading beyond the end of the buffer
102	cmp	len, 8
103	jb	less_than_8
104
105	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
106	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
107	;; 1) ALIGN: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
108	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
109
110	mov	bufptmp, bufp       ;; rdi = *buf
111	neg	bufp
112	and	bufp, 7             ;; calculate the unalignment amount of
113				    ;; the address
114	je	proc_block          ;; Skip if aligned
115
116	;;;; Calculate CRC of unaligned bytes of the buffer (if any) ;;;
117	mov	tmp, [bufptmp]      ;; load a quadword from the buffer
118	add	bufptmp, bufp       ;; align buffer pointer for quadword
119				    ;; processing
120	sub	len, bufp           ;; update buffer length
121align_loop:
122	crc32	crc_init_dw, bl     ;; compute crc32 of 1-byte
123	shr	tmp, 8              ;; get next byte
124	dec	bufp
125	jne	align_loop
126
127proc_block:
128
129	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
130	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
131	;; 2) PROCESS  BLOCKS: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
132	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
133
134	;; compute num of bytes to be processed
135	mov	tmp, len        ;; save num bytes in tmp
136
137	cmp	len, 128*24
138	jae	full_block
139
140continue_block:
141	cmp	len, SMALL_SIZE
142	jb	small
143
144	;; len < 128*24
145	mov	rax, 2731       ;; 2731 = ceil(2^16 / 24)
146	mul	len_dw
147	shr	rax, 16
148
149	;; eax contains floor(bytes / 24) = num 24-byte chunks to do
150
151	;; process rax 24-byte chunks (128 >= rax >= 0)
152
153	;; compute end address of each block
154	;; rdi -> block 0 (base addr + RAX * 8)
155	;; rsi -> block 1 (base addr + RAX * 16)
156	;; r11 -> block 2 (base addr + RAX * 24)
157	lea	block_0, [bufptmp + rax * 8]
158	lea	block_1, [block_0 + rax * 8]
159	lea	block_2, [block_1 + rax * 8]
160
161	xor	crc1,crc1
162	xor	crc2,crc2
163
164	;; branch into array
165	lea	bufp, [jump_table]
166	movzx	len, word [bufp + rax * 2] ;; len is offset from crc_array
167	lea	bufp, [bufp + len + crc_array - jump_table]
168	jmp	bufp
169
170	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
171	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
172	;; 2a) PROCESS FULL BLOCKS: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
173	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
174full_block:
175	mov	rax, 128
176	lea	block_1, [block_0 + 128*8*2]
177	lea	block_2, [block_0 + 128*8*3]
178	add	block_0, 128*8*1
179
180	xor	crc1,crc1
181	xor	crc2,crc2
182
183;       ;; branch into array
184;       jmp     CONCAT(crc_,128,)
185	; Fall thruogh into top of crc array (crc_128)
186
187	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
188	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
189	;; 3) CRC Array: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
190	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
191
192crc_array:
193	cmp 	len, 128*24*2
194	jbe 	non_prefetch
195
196%assign i 128
197%rep 128-1
198
199CONCAT(_crc_,i,:)
200	crc32	crc_init,  qword [block_0 - i*8]
201	crc32	crc1,      qword [block_1 - i*8]
202	crc32	crc2,      qword [block_2 - i*8]
203
204 %if i > 128*8 / 32	; prefetch next 3KB data
205	prefetchnta [block_2 + 128*32 - i*32]
206 %endif
207
208%assign i (i-1)
209%endrep
210 	jmp next_
211
212non_prefetch:
213%assign i 128
214%rep 128-1
215
216CONCAT(crc_,i,:)
217	crc32	crc_init,  qword [block_0 - i*8]
218	crc32	crc1,      qword [block_1 - i*8]
219	crc32	crc2,      qword [block_2 - i*8]
220%assign i (i-1)
221%endrep
222
223next_:
224CONCAT(crc_,i,:)
225	crc32	crc_init,  qword [block_0 - i*8]
226	crc32	crc1,      qword [block_1 - i*8]
227; SKIP  ;crc32  crc2,      [block_2 - i*8] ; Don't do this one yet
228
229	mov	block_0, block_2
230
231	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
232	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
233	;; 4) Combine three results: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
234	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
235
236	lea	bufp, [K_table - 16]    ; first entry is for idx 1
237	shl	rax, 3                          ; rax *= 8
238	sub	tmp, rax                        ; tmp -= rax*8
239	shl	rax, 1
240	sub	tmp, rax        ; tmp -= rax*16 (total tmp -= rax*24)
241	add	bufp, rax
242
243	movdqa	xmm0, [bufp]                    ; 2 consts: K1:K2
244
245	movq	xmm1, crc_init                  ; CRC for block 1
246	pclmulqdq	xmm1, xmm0, 0x00        ; Multiply by K2
247
248	movq	xmm2, crc1                      ; CRC for block 2
249	pclmulqdq	xmm2, xmm0, 0x10        ; Multiply by K1
250
251	pxor	xmm1, xmm2
252	movq	rax, xmm1
253	xor	rax, [block_2 - i*8]
254	mov	crc_init, crc2
255	crc32	crc_init, rax
256
257	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
258	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
259	;; 5) Check for end: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
260	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
261
262CONCAT(crc_,0,:)
263	mov	len, tmp
264	cmp	tmp, 128*24
265	jae	full_block
266	cmp	tmp, 24
267	jae	continue_block
268
269fewer_than_24:
270	;; now fewer than 24 bytes remain
271	cmp	tmp, 16
272	jae	do_16
273	cmp	tmp, 8
274	jae	do_8
275
276	;; 0 <= tmp <= 7
277	shl	ebx, 29        ; size now in bits 31:29
278	jz	do_return
279check_4:
280	mov	bufp, [bufptmp]
281	shl	ebx, 1         ; shift out into carry MSB (orig size & 4)
282	jnc	check_2
283	crc32	crc_init_dw, bufp_dw
284	jz	do_return
285	shr	bufp, 32       ; shift data down by 4 bytes
286check_2:
287	shl	ebx, 1         ; shift out into carry MSB (orig size & 2)
288	jnc	check_1
289	crc32	crc_init_dw, bufp_w
290	jz	do_return
291	shr	bufp, 16       ; shift data down by 2 bytes
292check_1:
293	crc32	crc_init_dw, bufp_b
294
295do_return:
296	mov	rax, crc_init
297	pop	rsi
298	pop	rdi
299	pop	rbx
300	ret
301
302do_8:
303	crc32	crc_init, qword [bufptmp]
304	add	bufptmp, 8
305	shl	ebx, 29        ; size (0...7) in bits 31:29
306	jnz	check_4
307	mov	rax, crc_init
308	pop	rsi
309	pop	rdi
310	pop	rbx
311	ret
312
313do_16:
314	crc32	crc_init, qword [bufptmp]
315	crc32	crc_init, qword [bufptmp+8]
316	add	bufptmp, 16
317	shl	ebx, 29        ; size (0...7) in bits 31:29
318	jnz	check_4
319	mov	rax, crc_init
320	pop	rsi
321	pop	rdi
322	pop	rbx
323	ret
324
325
326
327
328	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
329	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
330	;; Handle the case of fewer than 8 bytes, unaligned. In this case
331	;; we can't read 8 bytes, as this might go beyond the end of the buffer
332	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
333
334less_than_8:
335	test	len,4
336	jz	less_than_4
337	crc32	crc_init_dw, dword[bufp]
338	add	bufp,4
339less_than_4:
340	test	len,2
341	jz	less_than_2
342	crc32	crc_init_dw, word[bufp]
343	add	bufp,2
344less_than_2:
345	test	len,1
346	jz	do_return
347	crc32	crc_init_dw, byte[bufp]
348	mov	rax, crc_init
349	pop	rsi
350	pop	rdi
351	pop	rbx
352	ret
353
354;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
355;;4) LESS THAN 256-bytes REMAIN AT THIS POINT (8-bits of len are full)
356
357small:
358	mov rax, crc_init
359
360bit8:
361	shl len_b, 1               ;; shift-out MSB (bit-7)
362	jnc bit7                   ;; jump to bit-6 if bit-7 == 0
363 %assign i 0
364 %rep 16
365	crc32 rax, qword [bufptmp+i] ;; compute crc32 of 8-byte data
366	%assign i (i+8)
367 %endrep
368	je do_return2              ;; return if remaining data is zero
369	add bufptmp, 128           ;; buf +=64; (next 64 bytes)
370
371bit7:
372	shl len_b, 1               ;; shift-out MSB (bit-7)
373	jnc bit6                   ;; jump to bit-6 if bit-7 == 0
374 %assign i 0
375 %rep 8
376	crc32 rax, qword [bufptmp+i] ;; compute crc32 of 8-byte data
377	%assign i (i+8)
378 %endrep
379	je do_return2              ;; return if remaining data is zero
380	add bufptmp, 64            ;; buf +=64; (next 64 bytes)
381bit6:
382	shl len_b, 1               ;; shift-out MSB (bit-6)
383	jnc bit5                   ;; jump to bit-5 if bit-6 == 0
384 %assign i 0
385 %rep 4
386	crc32 rax, qword [bufptmp+i] ;;    compute crc32 of 8-byte data
387	%assign i (i+8)
388 %endrep
389	je do_return2              ;; return if remaining data is zero
390	add bufptmp, 32            ;; buf +=32; (next 32 bytes)
391bit5:
392	shl len_b, 1               ;; shift-out MSB (bit-5)
393	jnc bit4                   ;; jump to bit-4 if bit-5 == 0
394 %assign i 0
395 %rep 2
396	crc32 rax, qword [bufptmp+i] ;;    compute crc32 of 8-byte data
397	%assign i (i+8)
398 %endrep
399	je do_return2              ;; return if remaining data is zero
400	add bufptmp, 16            ;; buf +=16; (next 16 bytes)
401bit4:
402	shl len_b, 1               ;; shift-out MSB (bit-4)
403	jnc bit3                   ;; jump to bit-3 if bit-4 == 0
404	crc32 rax, qword [bufptmp] ;; compute crc32 of 8-byte data
405	je do_return2              ;; return if remaining data is zero
406	add bufptmp, 8             ;; buf +=8; (next 8 bytes)
407bit3:
408	mov rbx, qword [bufptmp]   ;; load a 8-bytes from the buffer:
409	shl len_b, 1               ;; shift-out MSB (bit-3)
410	jnc bit2                   ;; jump to bit-2 if bit-3 == 0
411	crc32 eax, ebx             ;; compute crc32 of 4-byte data
412	je do_return2              ;; return if remaining data is zero
413	shr rbx, 32                ;; get next 3 bytes
414bit2:
415	shl len_b, 1               ;; shift-out MSB (bit-2)
416	jnc bit1                   ;; jump to bit-1 if bit-2 == 0
417	crc32 eax, bx              ;; compute crc32 of 2-byte data
418	je do_return2              ;; return if remaining data is zero
419	shr rbx, 16                ;; next byte
420bit1:
421	test len_b,len_b
422	je do_return2
423	crc32 eax, bl              ;; compute crc32 of 1-byte data
424;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
425;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
426
427do_return2:
428	pop	rsi
429	pop	rdi
430	pop	rbx
431	ret
432
433
434
435	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
436	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
437	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
438	;; jump table        ;; Table is 129 entries x 2 bytes each
439	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
440align 4
441jump_table:
442%assign i 0
443%rep 129
444	dw	CONCAT(crc_,i,) - crc_array
445%assign i (i+1)
446%endrep
447
448
449
450	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
451	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
452	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
453	;; PCLMULQDQ tables
454	;; Table is 128 entries x 2 quad words each
455	;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
456section .data
457align 64
458K_table:
459	dq 0x14cd00bd6, 0x105ec76f0
460	dq 0x0ba4fc28e, 0x14cd00bd6
461	dq 0x1d82c63da, 0x0f20c0dfe
462	dq 0x09e4addf8, 0x0ba4fc28e
463	dq 0x039d3b296, 0x1384aa63a
464	dq 0x102f9b8a2, 0x1d82c63da
465	dq 0x14237f5e6, 0x01c291d04
466	dq 0x00d3b6092, 0x09e4addf8
467	dq 0x0c96cfdc0, 0x0740eef02
468	dq 0x18266e456, 0x039d3b296
469	dq 0x0daece73e, 0x0083a6eec
470	dq 0x0ab7aff2a, 0x102f9b8a2
471	dq 0x1248ea574, 0x1c1733996
472	dq 0x083348832, 0x14237f5e6
473	dq 0x12c743124, 0x02ad91c30
474	dq 0x0b9e02b86, 0x00d3b6092
475	dq 0x018b33a4e, 0x06992cea2
476	dq 0x1b331e26a, 0x0c96cfdc0
477	dq 0x17d35ba46, 0x07e908048
478	dq 0x1bf2e8b8a, 0x18266e456
479	dq 0x1a3e0968a, 0x11ed1f9d8
480	dq 0x0ce7f39f4, 0x0daece73e
481	dq 0x061d82e56, 0x0f1d0f55e
482	dq 0x0d270f1a2, 0x0ab7aff2a
483	dq 0x1c3f5f66c, 0x0a87ab8a8
484	dq 0x12ed0daac, 0x1248ea574
485	dq 0x065863b64, 0x08462d800
486	dq 0x11eef4f8e, 0x083348832
487	dq 0x1ee54f54c, 0x071d111a8
488	dq 0x0b3e32c28, 0x12c743124
489	dq 0x0064f7f26, 0x0ffd852c6
490	dq 0x0dd7e3b0c, 0x0b9e02b86
491	dq 0x0f285651c, 0x0dcb17aa4
492	dq 0x010746f3c, 0x018b33a4e
493	dq 0x1c24afea4, 0x0f37c5aee
494	dq 0x0271d9844, 0x1b331e26a
495	dq 0x08e766a0c, 0x06051d5a2
496	dq 0x093a5f730, 0x17d35ba46
497	dq 0x06cb08e5c, 0x11d5ca20e
498	dq 0x06b749fb2, 0x1bf2e8b8a
499	dq 0x1167f94f2, 0x021f3d99c
500	dq 0x0cec3662e, 0x1a3e0968a
501	dq 0x19329634a, 0x08f158014
502	dq 0x0e6fc4e6a, 0x0ce7f39f4
503	dq 0x08227bb8a, 0x1a5e82106
504	dq 0x0b0cd4768, 0x061d82e56
505	dq 0x13c2b89c4, 0x188815ab2
506	dq 0x0d7a4825c, 0x0d270f1a2
507	dq 0x10f5ff2ba, 0x105405f3e
508	dq 0x00167d312, 0x1c3f5f66c
509	dq 0x0f6076544, 0x0e9adf796
510	dq 0x026f6a60a, 0x12ed0daac
511	dq 0x1a2adb74e, 0x096638b34
512	dq 0x19d34af3a, 0x065863b64
513	dq 0x049c3cc9c, 0x1e50585a0
514	dq 0x068bce87a, 0x11eef4f8e
515	dq 0x1524fa6c6, 0x19f1c69dc
516	dq 0x16cba8aca, 0x1ee54f54c
517	dq 0x042d98888, 0x12913343e
518	dq 0x1329d9f7e, 0x0b3e32c28
519	dq 0x1b1c69528, 0x088f25a3a
520	dq 0x02178513a, 0x0064f7f26
521	dq 0x0e0ac139e, 0x04e36f0b0
522	dq 0x0170076fa, 0x0dd7e3b0c
523	dq 0x141a1a2e2, 0x0bd6f81f8
524	dq 0x16ad828b4, 0x0f285651c
525	dq 0x041d17b64, 0x19425cbba
526	dq 0x1fae1cc66, 0x010746f3c
527	dq 0x1a75b4b00, 0x18db37e8a
528	dq 0x0f872e54c, 0x1c24afea4
529	dq 0x01e41e9fc, 0x04c144932
530	dq 0x086d8e4d2, 0x0271d9844
531	dq 0x160f7af7a, 0x052148f02
532	dq 0x05bb8f1bc, 0x08e766a0c
533	dq 0x0a90fd27a, 0x0a3c6f37a
534	dq 0x0b3af077a, 0x093a5f730
535	dq 0x04984d782, 0x1d22c238e
536	dq 0x0ca6ef3ac, 0x06cb08e5c
537	dq 0x0234e0b26, 0x063ded06a
538	dq 0x1d88abd4a, 0x06b749fb2
539	dq 0x04597456a, 0x04d56973c
540	dq 0x0e9e28eb4, 0x1167f94f2
541	dq 0x07b3ff57a, 0x19385bf2e
542	dq 0x0c9c8b782, 0x0cec3662e
543	dq 0x13a9cba9e, 0x0e417f38a
544	dq 0x093e106a4, 0x19329634a
545	dq 0x167001a9c, 0x14e727980
546	dq 0x1ddffc5d4, 0x0e6fc4e6a
547	dq 0x00df04680, 0x0d104b8fc
548	dq 0x02342001e, 0x08227bb8a
549	dq 0x00a2a8d7e, 0x05b397730
550	dq 0x168763fa6, 0x0b0cd4768
551	dq 0x1ed5a407a, 0x0e78eb416
552	dq 0x0d2c3ed1a, 0x13c2b89c4
553	dq 0x0995a5724, 0x1641378f0
554	dq 0x19b1afbc4, 0x0d7a4825c
555	dq 0x109ffedc0, 0x08d96551c
556	dq 0x0f2271e60, 0x10f5ff2ba
557	dq 0x00b0bf8ca, 0x00bf80dd2
558	dq 0x123888b7a, 0x00167d312
559	dq 0x1e888f7dc, 0x18dcddd1c
560	dq 0x002ee03b2, 0x0f6076544
561	dq 0x183e8d8fe, 0x06a45d2b2
562	dq 0x133d7a042, 0x026f6a60a
563	dq 0x116b0f50c, 0x1dd3e10e8
564	dq 0x05fabe670, 0x1a2adb74e
565	dq 0x130004488, 0x0de87806c
566	dq 0x000bcf5f6, 0x19d34af3a
567	dq 0x18f0c7078, 0x014338754
568	dq 0x017f27698, 0x049c3cc9c
569	dq 0x058ca5f00, 0x15e3e77ee
570	dq 0x1af900c24, 0x068bce87a
571	dq 0x0b5cfca28, 0x0dd07448e
572	dq 0x0ded288f8, 0x1524fa6c6
573	dq 0x059f229bc, 0x1d8048348
574	dq 0x06d390dec, 0x16cba8aca
575	dq 0x037170390, 0x0a3e3e02c
576	dq 0x06353c1cc, 0x042d98888
577	dq 0x0c4584f5c, 0x0d73c7bea
578	dq 0x1f16a3418, 0x1329d9f7e
579	dq 0x0531377e2, 0x185137662
580	dq 0x1d8d9ca7c, 0x1b1c69528
581	dq 0x0b25b29f2, 0x18a08b5bc
582	dq 0x19fb2a8b0, 0x02178513a
583	dq 0x1a08fe6ac, 0x1da758ae0
584	dq 0x045cddf4e, 0x0e0ac139e
585	dq 0x1a91647f2, 0x169cf9eb0
586	dq 0x1a0f717c4, 0x0170076fa
587
588;;;       func            core, ver, snum
589slversion crc32_iscsi_01, 01,   04,  0015
590
591