1 /* SPDX-License-Identifier: GPL-2.0-or-later */
3 * include/asm-alpha/xor.h
5 * Optimized RAID-5 checksumming functions for alpha EV5 and EV6
9 xor_alpha_2(unsigned long bytes, unsigned long * __restrict p1,
10 const unsigned long * __restrict p2);
12 xor_alpha_3(unsigned long bytes, unsigned long * __restrict p1,
13 const unsigned long * __restrict p2,
14 const unsigned long * __restrict p3);
16 xor_alpha_4(unsigned long bytes, unsigned long * __restrict p1,
17 const unsigned long * __restrict p2,
18 const unsigned long * __restrict p3,
19 const unsigned long * __restrict p4);
21 xor_alpha_5(unsigned long bytes, unsigned long * __restrict p1,
22 const unsigned long * __restrict p2,
23 const unsigned long * __restrict p3,
24 const unsigned long * __restrict p4,
25 const unsigned long * __restrict p5);
28 xor_alpha_prefetch_2(unsigned long bytes, unsigned long * __restrict p1,
29 const unsigned long * __restrict p2);
31 xor_alpha_prefetch_3(unsigned long bytes, unsigned long * __restrict p1,
32 const unsigned long * __restrict p2,
33 const unsigned long * __restrict p3);
35 xor_alpha_prefetch_4(unsigned long bytes, unsigned long * __restrict p1,
36 const unsigned long * __restrict p2,
37 const unsigned long * __restrict p3,
38 const unsigned long * __restrict p4);
40 xor_alpha_prefetch_5(unsigned long bytes, unsigned long * __restrict p1,
41 const unsigned long * __restrict p2,
42 const unsigned long * __restrict p3,
43 const unsigned long * __restrict p4,
44 const unsigned long * __restrict p5);
73 xor $0,$1,$0 # 7 cycles from $1 load \n\
130 xor $0,$1,$1 # 8 cycles from $0 load \n\
131 xor $3,$4,$4 # 6 cycles from $4 load \n\
132 xor $6,$7,$7 # 6 cycles from $7 load \n\
133 xor $21,$22,$22 # 5 cycles from $22 load \n\
135 xor $1,$2,$2 # 9 cycles from $2 load \n\
136 xor $24,$25,$25 # 5 cycles from $25 load \n\
138 xor $4,$5,$5 # 6 cycles from $5 load \n\
141 xor $7,$20,$20 # 7 cycles from $20 load \n\
143 xor $22,$23,$23 # 7 cycles from $23 load \n\
146 xor $25,$27,$27 # 7 cycles from $27 load \n\
161 xor $0,$1,$1 # 4 cycles from $1 load \n\
162 xor $3,$4,$4 # 5 cycles from $4 load \n\
163 xor $6,$7,$7 # 5 cycles from $7 load \n\
165 xor $1,$2,$2 # 4 cycles from $2 load \n\
166 xor $4,$5,$5 # 5 cycles from $5 load \n\
168 xor $7,$20,$20 # 4 cycles from $20 load \n\
204 xor $0,$1,$1 # 6 cycles from $1 load \n\
206 xor $2,$3,$3 # 6 cycles from $3 load \n\
211 xor $4,$5,$5 # 7 cycles from $5 load \n\
215 xor $21,$22,$22 # 7 cycles from $22 load \n\
219 xor $23,$24,$24 # 7 cycles from $24 load \n\
226 xor $25,$27,$27 # 8 cycles from $27 load \n\
234 xor $0,$1,$1 # 9 cycles from $1 load \n\
235 xor $2,$3,$3 # 5 cycles from $3 load \n\
239 xor $4,$5,$5 # 5 cycles from $5 load \n\
250 xor $6,$7,$7 # 8 cycles from $6 load \n\
254 xor $21,$22,$22 # 8 cycles from $22 load \n\
256 xor $23,$24,$24 # 5 cycles from $24 load \n\
259 xor $25,$27,$27 # 5 cycles from $27 load \n\
261 xor $0,$1,$1 # 5 cycles from $1 load \n\
264 xor $2,$3,$3 # 4 cycles from $3 load \n\
301 xor $0,$1,$1 # 6 cycles from $1 load \n\
303 xor $2,$3,$3 # 6 cycles from $3 load \n\
308 xor $3,$4,$4 # 7 cycles from $4 load \n\
311 xor $5,$6,$6 # 7 cycles from $6 load \n\
312 xor $7,$22,$22 # 7 cycles from $22 load \n\
313 xor $6,$23,$23 # 7 cycles from $23 load \n\
318 xor $24,$25,$25 # 8 cycles from $25 load \n\
321 xor $25,$27,$27 # 8 cycles from $27 load \n\
323 xor $28,$0,$0 # 7 cycles from $0 load \n\
331 xor $1,$2,$2 # 6 cycles from $2 load \n\
333 xor $3,$4,$4 # 4 cycles from $4 load \n\
343 xor $4,$5,$5 # 7 cycles from $5 load \n\
346 xor $6,$7,$7 # 7 cycles from $7 load \n\
351 xor $7,$22,$22 # 7 cycles from $22 load \n\
353 xor $23,$24,$24 # 6 cycles from $24 load \n\
358 xor $25,$27,$27 # 7 cycles from $27 load \n\
361 xor $27,$28,$28 # 8 cycles from $28 load \n\
363 xor $0,$1,$1 # 6 cycles from $1 load \n\
371 xor $2,$3,$3 # 9 cycles from $3 load \n\
372 xor $3,$4,$4 # 9 cycles from $4 load \n\
373 xor $5,$6,$6 # 8 cycles from $6 load \n\
377 xor $7,$22,$22 # 7 cycles from $22 load \n\
378 xor $23,$24,$24 # 6 cycles from $24 load \n\
383 xor $24,$25,$25 # 8 cycles from $25 load \n\
397 .ent xor_alpha_prefetch_2 \n\
398 xor_alpha_prefetch_2: \n\
408 ldq $31, 128($17) \n\
409 ldq $31, 128($18) \n\
411 ldq $31, 192($17) \n\
412 ldq $31, 192($18) \n\
436 xor $0,$1,$0 # 8 cycles from $1 load \n\
463 .end xor_alpha_prefetch_2 \n\
466 .ent xor_alpha_prefetch_3 \n\
467 xor_alpha_prefetch_3: \n\
479 ldq $31, 128($17) \n\
480 ldq $31, 128($18) \n\
481 ldq $31, 128($19) \n\
483 ldq $31, 192($17) \n\
484 ldq $31, 192($18) \n\
485 ldq $31, 192($19) \n\
508 xor $0,$1,$1 # 8 cycles from $0 load \n\
509 xor $3,$4,$4 # 7 cycles from $4 load \n\
510 xor $6,$7,$7 # 6 cycles from $7 load \n\
511 xor $21,$22,$22 # 5 cycles from $22 load \n\
513 xor $1,$2,$2 # 9 cycles from $2 load \n\
514 xor $24,$25,$25 # 5 cycles from $25 load \n\
516 xor $4,$5,$5 # 6 cycles from $5 load \n\
519 xor $7,$20,$20 # 7 cycles from $20 load \n\
521 xor $22,$23,$23 # 7 cycles from $23 load \n\
524 xor $25,$27,$27 # 7 cycles from $27 load \n\
543 xor $0,$1,$1 # 6 cycles from $1 load \n\
544 xor $3,$4,$4 # 5 cycles from $4 load \n\
545 xor $6,$7,$7 # 5 cycles from $7 load \n\
546 xor $1,$2,$2 # 4 cycles from $2 load \n\
548 xor $4,$5,$5 # 5 cycles from $5 load \n\
549 xor $7,$20,$20 # 4 cycles from $20 load \n\
561 .end xor_alpha_prefetch_3 \n\
564 .ent xor_alpha_prefetch_4 \n\
565 xor_alpha_prefetch_4: \n\
579 ldq $31, 128($17) \n\
580 ldq $31, 128($18) \n\
581 ldq $31, 128($19) \n\
582 ldq $31, 128($20) \n\
584 ldq $31, 192($17) \n\
585 ldq $31, 192($18) \n\
586 ldq $31, 192($19) \n\
587 ldq $31, 192($20) \n\
606 xor $0,$1,$1 # 6 cycles from $1 load \n\
608 xor $2,$3,$3 # 6 cycles from $3 load \n\
613 xor $4,$5,$5 # 7 cycles from $5 load \n\
617 xor $21,$22,$22 # 7 cycles from $22 load \n\
621 xor $23,$24,$24 # 7 cycles from $24 load \n\
628 xor $25,$27,$27 # 8 cycles from $27 load \n\
636 xor $0,$1,$1 # 9 cycles from $1 load \n\
637 xor $2,$3,$3 # 5 cycles from $3 load \n\
641 xor $4,$5,$5 # 5 cycles from $5 load \n\
653 xor $6,$7,$7 # 8 cycles from $6 load \n\
656 xor $21,$22,$22 # 8 cycles from $22 load \n\
661 xor $23,$24,$24 # 6 cycles from $24 load \n\
663 xor $25,$27,$27 # 6 cycles from $27 load \n\
667 xor $0,$1,$1 # 7 cycles from $1 load \n\
668 xor $2,$3,$3 # 6 cycles from $3 load \n\
683 .end xor_alpha_prefetch_4 \n\
686 .ent xor_alpha_prefetch_5 \n\
687 xor_alpha_prefetch_5: \n\
703 ldq $31, 128($17) \n\
704 ldq $31, 128($18) \n\
705 ldq $31, 128($19) \n\
706 ldq $31, 128($20) \n\
707 ldq $31, 128($21) \n\
709 ldq $31, 192($17) \n\
710 ldq $31, 192($18) \n\
711 ldq $31, 192($19) \n\
712 ldq $31, 192($20) \n\
713 ldq $31, 192($21) \n\
732 xor $0,$1,$1 # 6 cycles from $1 load \n\
734 xor $2,$3,$3 # 6 cycles from $3 load \n\
739 xor $3,$4,$4 # 7 cycles from $4 load \n\
742 xor $5,$6,$6 # 7 cycles from $6 load \n\
743 xor $7,$22,$22 # 7 cycles from $22 load \n\
744 xor $6,$23,$23 # 7 cycles from $23 load \n\
749 xor $24,$25,$25 # 8 cycles from $25 load \n\
752 xor $25,$27,$27 # 8 cycles from $27 load \n\
754 xor $28,$0,$0 # 7 cycles from $0 load \n\
762 xor $1,$2,$2 # 6 cycles from $2 load \n\
764 xor $3,$4,$4 # 4 cycles from $4 load \n\
774 xor $4,$5,$5 # 7 cycles from $5 load \n\
777 xor $6,$7,$7 # 7 cycles from $7 load \n\
782 xor $7,$22,$22 # 7 cycles from $22 load \n\
784 xor $23,$24,$24 # 6 cycles from $24 load \n\
789 xor $25,$27,$27 # 7 cycles from $27 load \n\
792 xor $27,$28,$28 # 8 cycles from $28 load \n\
794 xor $0,$1,$1 # 6 cycles from $1 load \n\
804 xor $2,$3,$3 # 9 cycles from $3 load \n\
807 xor $3,$4,$4 # 9 cycles from $4 load \n\
809 xor $5,$6,$6 # 8 cycles from $6 load \n\
813 xor $7,$22,$22 # 7 cycles from $22 load \n\
814 xor $23,$24,$24 # 6 cycles from $24 load \n\
819 xor $24,$25,$25 # 8 cycles from $25 load \n\
832 .end xor_alpha_prefetch_5 \n\
835 static struct xor_block_template xor_block_alpha = {
843 static struct xor_block_template xor_block_alpha_prefetch = {
844 .name = "alpha prefetch",
845 .do_2 = xor_alpha_prefetch_2,
846 .do_3 = xor_alpha_prefetch_3,
847 .do_4 = xor_alpha_prefetch_4,
848 .do_5 = xor_alpha_prefetch_5,
851 /* For grins, also test the generic routines. */
852 #include <asm-generic/xor.h>
854 #undef XOR_TRY_TEMPLATES
855 #define XOR_TRY_TEMPLATES \
857 xor_speed(&xor_block_8regs); \
858 xor_speed(&xor_block_32regs); \
859 xor_speed(&xor_block_alpha); \
860 xor_speed(&xor_block_alpha_prefetch); \
863 /* Force the use of alpha_prefetch if EV6, as it is significantly
864 faster in the cold cache case. */
865 #define XOR_SELECT_TEMPLATE(FASTEST) \
866 (implver() == IMPLVER_EV6 ? &xor_block_alpha_prefetch : FASTEST)