Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

lib/xor: make xor prototypes more friendly to compiler vectorization

Modern compilers are perfectly capable of extracting parallelism from
the XOR routines, provided that the prototypes reflect the nature of the
input accurately, in particular, the fact that the input vectors are
expected not to overlap. This is not documented explicitly, but is
implied by the interchangeability of the various C routines, some of
which use temporary variables while others don't: this means that these
routines only behave identically for non-overlapping inputs.

So let's decorate these input vectors with the __restrict modifier,
which informs the compiler that there is no overlap. While at it, make
the input-only vectors pointer-to-const as well.

Tested-by: Nathan Chancellor <nathan@kernel.org>
Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Nick Desaulniers <ndesaulniers@google.com>
Link: https://github.com/ClangBuiltLinux/linux/issues/563
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Ard Biesheuvel and committed by
Herbert Xu
297565aa e8bf24bd

+381 -208
+36 -17
arch/alpha/include/asm/xor.h
··· 5 5 * Optimized RAID-5 checksumming functions for alpha EV5 and EV6 6 6 */ 7 7 8 - extern void xor_alpha_2(unsigned long, unsigned long *, unsigned long *); 9 - extern void xor_alpha_3(unsigned long, unsigned long *, unsigned long *, 10 - unsigned long *); 11 - extern void xor_alpha_4(unsigned long, unsigned long *, unsigned long *, 12 - unsigned long *, unsigned long *); 13 - extern void xor_alpha_5(unsigned long, unsigned long *, unsigned long *, 14 - unsigned long *, unsigned long *, unsigned long *); 8 + extern void 9 + xor_alpha_2(unsigned long bytes, unsigned long * __restrict p1, 10 + const unsigned long * __restrict p2); 11 + extern void 12 + xor_alpha_3(unsigned long bytes, unsigned long * __restrict p1, 13 + const unsigned long * __restrict p2, 14 + const unsigned long * __restrict p3); 15 + extern void 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); 20 + extern void 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); 15 26 16 - extern void xor_alpha_prefetch_2(unsigned long, unsigned long *, 17 - unsigned long *); 18 - extern void xor_alpha_prefetch_3(unsigned long, unsigned long *, 19 - unsigned long *, unsigned long *); 20 - extern void xor_alpha_prefetch_4(unsigned long, unsigned long *, 21 - unsigned long *, unsigned long *, 22 - unsigned long *); 23 - extern void xor_alpha_prefetch_5(unsigned long, unsigned long *, 24 - unsigned long *, unsigned long *, 25 - unsigned long *, unsigned long *); 27 + extern void 28 + xor_alpha_prefetch_2(unsigned long bytes, unsigned long * __restrict p1, 29 + const unsigned long * __restrict p2); 30 + extern void 31 + xor_alpha_prefetch_3(unsigned long bytes, unsigned long * __restrict p1, 32 + const unsigned long * __restrict p2, 33 + const unsigned long * __restrict p3); 34 + extern void 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); 39 + extern void 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); 26 45 27 46 asm(" \n\ 28 47 .text \n\
+28 -14
arch/arm/include/asm/xor.h
··· 44 44 : "0" (dst), "r" (a1), "r" (a2), "r" (a3), "r" (a4)) 45 45 46 46 static void 47 - xor_arm4regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 47 + xor_arm4regs_2(unsigned long bytes, unsigned long * __restrict p1, 48 + const unsigned long * __restrict p2) 48 49 { 49 50 unsigned int lines = bytes / sizeof(unsigned long) / 4; 50 51 register unsigned int a1 __asm__("r4"); ··· 65 64 } 66 65 67 66 static void 68 - xor_arm4regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 69 - unsigned long *p3) 67 + xor_arm4regs_3(unsigned long bytes, unsigned long * __restrict p1, 68 + const unsigned long * __restrict p2, 69 + const unsigned long * __restrict p3) 70 70 { 71 71 unsigned int lines = bytes / sizeof(unsigned long) / 4; 72 72 register unsigned int a1 __asm__("r4"); ··· 88 86 } 89 87 90 88 static void 91 - xor_arm4regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 92 - unsigned long *p3, unsigned long *p4) 89 + xor_arm4regs_4(unsigned long bytes, unsigned long * __restrict p1, 90 + const unsigned long * __restrict p2, 91 + const unsigned long * __restrict p3, 92 + const unsigned long * __restrict p4) 93 93 { 94 94 unsigned int lines = bytes / sizeof(unsigned long) / 2; 95 95 register unsigned int a1 __asm__("r8"); ··· 109 105 } 110 106 111 107 static void 112 - xor_arm4regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 113 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 108 + xor_arm4regs_5(unsigned long bytes, unsigned long * __restrict p1, 109 + const unsigned long * __restrict p2, 110 + const unsigned long * __restrict p3, 111 + const unsigned long * __restrict p4, 112 + const unsigned long * __restrict p5) 114 113 { 115 114 unsigned int lines = bytes / sizeof(unsigned long) / 2; 116 115 register unsigned int a1 __asm__("r8"); ··· 153 146 extern struct xor_block_template const xor_block_neon_inner; 154 147 155 148 static void 156 - xor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 149 + xor_neon_2(unsigned long bytes, unsigned long * __restrict p1, 150 + const unsigned long * __restrict p2) 157 151 { 158 152 if (in_interrupt()) { 159 153 xor_arm4regs_2(bytes, p1, p2); ··· 166 158 } 167 159 168 160 static void 169 - xor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 170 - unsigned long *p3) 161 + xor_neon_3(unsigned long bytes, unsigned long * __restrict p1, 162 + const unsigned long * __restrict p2, 163 + const unsigned long * __restrict p3) 171 164 { 172 165 if (in_interrupt()) { 173 166 xor_arm4regs_3(bytes, p1, p2, p3); ··· 180 171 } 181 172 182 173 static void 183 - xor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 184 - unsigned long *p3, unsigned long *p4) 174 + xor_neon_4(unsigned long bytes, unsigned long * __restrict p1, 175 + const unsigned long * __restrict p2, 176 + const unsigned long * __restrict p3, 177 + const unsigned long * __restrict p4) 185 178 { 186 179 if (in_interrupt()) { 187 180 xor_arm4regs_4(bytes, p1, p2, p3, p4); ··· 195 184 } 196 185 197 186 static void 198 - xor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 199 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 187 + xor_neon_5(unsigned long bytes, unsigned long * __restrict p1, 188 + const unsigned long * __restrict p2, 189 + const unsigned long * __restrict p3, 190 + const unsigned long * __restrict p4, 191 + const unsigned long * __restrict p5) 200 192 { 201 193 if (in_interrupt()) { 202 194 xor_arm4regs_5(bytes, p1, p2, p3, p4, p5);
+14 -7
arch/arm64/include/asm/xor.h
··· 16 16 extern struct xor_block_template const xor_block_inner_neon; 17 17 18 18 static void 19 - xor_neon_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 19 + xor_neon_2(unsigned long bytes, unsigned long * __restrict p1, 20 + const unsigned long * __restrict p2) 20 21 { 21 22 kernel_neon_begin(); 22 23 xor_block_inner_neon.do_2(bytes, p1, p2); ··· 25 24 } 26 25 27 26 static void 28 - xor_neon_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 29 - unsigned long *p3) 27 + xor_neon_3(unsigned long bytes, unsigned long * __restrict p1, 28 + const unsigned long * __restrict p2, 29 + const unsigned long * __restrict p3) 30 30 { 31 31 kernel_neon_begin(); 32 32 xor_block_inner_neon.do_3(bytes, p1, p2, p3); ··· 35 33 } 36 34 37 35 static void 38 - xor_neon_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 39 - unsigned long *p3, unsigned long *p4) 36 + xor_neon_4(unsigned long bytes, unsigned long * __restrict p1, 37 + const unsigned long * __restrict p2, 38 + const unsigned long * __restrict p3, 39 + const unsigned long * __restrict p4) 40 40 { 41 41 kernel_neon_begin(); 42 42 xor_block_inner_neon.do_4(bytes, p1, p2, p3, p4); ··· 46 42 } 47 43 48 44 static void 49 - xor_neon_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 50 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 45 + xor_neon_5(unsigned long bytes, unsigned long * __restrict p1, 46 + const unsigned long * __restrict p2, 47 + const unsigned long * __restrict p3, 48 + const unsigned long * __restrict p4, 49 + const unsigned long * __restrict p5) 51 50 { 52 51 kernel_neon_begin(); 53 52 xor_block_inner_neon.do_5(bytes, p1, p2, p3, p4, p5);
+29 -17
arch/arm64/lib/xor-neon.c
··· 10 10 #include <linux/module.h> 11 11 #include <asm/neon-intrinsics.h> 12 12 13 - void xor_arm64_neon_2(unsigned long bytes, unsigned long *p1, 14 - unsigned long *p2) 13 + void xor_arm64_neon_2(unsigned long bytes, unsigned long * __restrict p1, 14 + const unsigned long * __restrict p2) 15 15 { 16 16 uint64_t *dp1 = (uint64_t *)p1; 17 17 uint64_t *dp2 = (uint64_t *)p2; ··· 37 37 } while (--lines > 0); 38 38 } 39 39 40 - void xor_arm64_neon_3(unsigned long bytes, unsigned long *p1, 41 - unsigned long *p2, unsigned long *p3) 40 + void xor_arm64_neon_3(unsigned long bytes, unsigned long * __restrict p1, 41 + const unsigned long * __restrict p2, 42 + const unsigned long * __restrict p3) 42 43 { 43 44 uint64_t *dp1 = (uint64_t *)p1; 44 45 uint64_t *dp2 = (uint64_t *)p2; ··· 73 72 } while (--lines > 0); 74 73 } 75 74 76 - void xor_arm64_neon_4(unsigned long bytes, unsigned long *p1, 77 - unsigned long *p2, unsigned long *p3, unsigned long *p4) 75 + void xor_arm64_neon_4(unsigned long bytes, unsigned long * __restrict p1, 76 + const unsigned long * __restrict p2, 77 + const unsigned long * __restrict p3, 78 + const unsigned long * __restrict p4) 78 79 { 79 80 uint64_t *dp1 = (uint64_t *)p1; 80 81 uint64_t *dp2 = (uint64_t *)p2; ··· 118 115 } while (--lines > 0); 119 116 } 120 117 121 - void xor_arm64_neon_5(unsigned long bytes, unsigned long *p1, 122 - unsigned long *p2, unsigned long *p3, 123 - unsigned long *p4, unsigned long *p5) 118 + void xor_arm64_neon_5(unsigned long bytes, unsigned long * __restrict p1, 119 + const unsigned long * __restrict p2, 120 + const unsigned long * __restrict p3, 121 + const unsigned long * __restrict p4, 122 + const unsigned long * __restrict p5) 124 123 { 125 124 uint64_t *dp1 = (uint64_t *)p1; 126 125 uint64_t *dp2 = (uint64_t *)p2; ··· 191 186 return res; 192 187 } 193 188 194 - static void xor_arm64_eor3_3(unsigned long bytes, unsigned long *p1, 195 - unsigned long *p2, unsigned long *p3) 189 + static void xor_arm64_eor3_3(unsigned long bytes, 190 + unsigned long * __restrict p1, 191 + const unsigned long * __restrict p2, 192 + const unsigned long * __restrict p3) 196 193 { 197 194 uint64_t *dp1 = (uint64_t *)p1; 198 195 uint64_t *dp2 = (uint64_t *)p2; ··· 226 219 } while (--lines > 0); 227 220 } 228 221 229 - static void xor_arm64_eor3_4(unsigned long bytes, unsigned long *p1, 230 - unsigned long *p2, unsigned long *p3, 231 - unsigned long *p4) 222 + static void xor_arm64_eor3_4(unsigned long bytes, 223 + unsigned long * __restrict p1, 224 + const unsigned long * __restrict p2, 225 + const unsigned long * __restrict p3, 226 + const unsigned long * __restrict p4) 232 227 { 233 228 uint64_t *dp1 = (uint64_t *)p1; 234 229 uint64_t *dp2 = (uint64_t *)p2; ··· 270 261 } while (--lines > 0); 271 262 } 272 263 273 - static void xor_arm64_eor3_5(unsigned long bytes, unsigned long *p1, 274 - unsigned long *p2, unsigned long *p3, 275 - unsigned long *p4, unsigned long *p5) 264 + static void xor_arm64_eor3_5(unsigned long bytes, 265 + unsigned long * __restrict p1, 266 + const unsigned long * __restrict p2, 267 + const unsigned long * __restrict p3, 268 + const unsigned long * __restrict p4, 269 + const unsigned long * __restrict p5) 276 270 { 277 271 uint64_t *dp1 = (uint64_t *)p1; 278 272 uint64_t *dp2 = (uint64_t *)p2;
+14 -7
arch/ia64/include/asm/xor.h
··· 4 4 */ 5 5 6 6 7 - extern void xor_ia64_2(unsigned long, unsigned long *, unsigned long *); 8 - extern void xor_ia64_3(unsigned long, unsigned long *, unsigned long *, 9 - unsigned long *); 10 - extern void xor_ia64_4(unsigned long, unsigned long *, unsigned long *, 11 - unsigned long *, unsigned long *); 12 - extern void xor_ia64_5(unsigned long, unsigned long *, unsigned long *, 13 - unsigned long *, unsigned long *, unsigned long *); 7 + extern void xor_ia64_2(unsigned long bytes, unsigned long * __restrict p1, 8 + const unsigned long * __restrict p2); 9 + extern void xor_ia64_3(unsigned long bytes, unsigned long * __restrict p1, 10 + const unsigned long * __restrict p2, 11 + const unsigned long * __restrict p3); 12 + extern void xor_ia64_4(unsigned long bytes, unsigned long * __restrict p1, 13 + const unsigned long * __restrict p2, 14 + const unsigned long * __restrict p3, 15 + const unsigned long * __restrict p4); 16 + extern void xor_ia64_5(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, 20 + const unsigned long * __restrict p5); 14 21 15 22 static struct xor_block_template xor_block_ia64 = { 16 23 .name = "ia64",
+14 -11
arch/powerpc/include/asm/xor_altivec.h
··· 3 3 #define _ASM_POWERPC_XOR_ALTIVEC_H 4 4 5 5 #ifdef CONFIG_ALTIVEC 6 - 7 - void xor_altivec_2(unsigned long bytes, unsigned long *v1_in, 8 - unsigned long *v2_in); 9 - void xor_altivec_3(unsigned long bytes, unsigned long *v1_in, 10 - unsigned long *v2_in, unsigned long *v3_in); 11 - void xor_altivec_4(unsigned long bytes, unsigned long *v1_in, 12 - unsigned long *v2_in, unsigned long *v3_in, 13 - unsigned long *v4_in); 14 - void xor_altivec_5(unsigned long bytes, unsigned long *v1_in, 15 - unsigned long *v2_in, unsigned long *v3_in, 16 - unsigned long *v4_in, unsigned long *v5_in); 6 + void xor_altivec_2(unsigned long bytes, unsigned long * __restrict p1, 7 + const unsigned long * __restrict p2); 8 + void xor_altivec_3(unsigned long bytes, unsigned long * __restrict p1, 9 + const unsigned long * __restrict p2, 10 + const unsigned long * __restrict p3); 11 + void xor_altivec_4(unsigned long bytes, unsigned long * __restrict p1, 12 + const unsigned long * __restrict p2, 13 + const unsigned long * __restrict p3, 14 + const unsigned long * __restrict p4); 15 + void xor_altivec_5(unsigned long bytes, unsigned long * __restrict p1, 16 + const unsigned long * __restrict p2, 17 + const unsigned long * __restrict p3, 18 + const unsigned long * __restrict p4, 19 + const unsigned long * __restrict p5); 17 20 18 21 #endif 19 22 #endif /* _ASM_POWERPC_XOR_ALTIVEC_H */
+18 -10
arch/powerpc/lib/xor_vmx.c
··· 49 49 V1##_3 = vec_xor(V1##_3, V2##_3); \ 50 50 } while (0) 51 51 52 - void __xor_altivec_2(unsigned long bytes, unsigned long *v1_in, 53 - unsigned long *v2_in) 52 + void __xor_altivec_2(unsigned long bytes, 53 + unsigned long * __restrict v1_in, 54 + const unsigned long * __restrict v2_in) 54 55 { 55 56 DEFINE(v1); 56 57 DEFINE(v2); ··· 68 67 } while (--lines > 0); 69 68 } 70 69 71 - void __xor_altivec_3(unsigned long bytes, unsigned long *v1_in, 72 - unsigned long *v2_in, unsigned long *v3_in) 70 + void __xor_altivec_3(unsigned long bytes, 71 + unsigned long * __restrict v1_in, 72 + const unsigned long * __restrict v2_in, 73 + const unsigned long * __restrict v3_in) 73 74 { 74 75 DEFINE(v1); 75 76 DEFINE(v2); ··· 92 89 } while (--lines > 0); 93 90 } 94 91 95 - void __xor_altivec_4(unsigned long bytes, unsigned long *v1_in, 96 - unsigned long *v2_in, unsigned long *v3_in, 97 - unsigned long *v4_in) 92 + void __xor_altivec_4(unsigned long bytes, 93 + unsigned long * __restrict v1_in, 94 + const unsigned long * __restrict v2_in, 95 + const unsigned long * __restrict v3_in, 96 + const unsigned long * __restrict v4_in) 98 97 { 99 98 DEFINE(v1); 100 99 DEFINE(v2); ··· 121 116 } while (--lines > 0); 122 117 } 123 118 124 - void __xor_altivec_5(unsigned long bytes, unsigned long *v1_in, 125 - unsigned long *v2_in, unsigned long *v3_in, 126 - unsigned long *v4_in, unsigned long *v5_in) 119 + void __xor_altivec_5(unsigned long bytes, 120 + unsigned long * __restrict v1_in, 121 + const unsigned long * __restrict v2_in, 122 + const unsigned long * __restrict v3_in, 123 + const unsigned long * __restrict v4_in, 124 + const unsigned long * __restrict v5_in) 127 125 { 128 126 DEFINE(v1); 129 127 DEFINE(v2);
+14 -13
arch/powerpc/lib/xor_vmx.h
··· 6 6 * outside of the enable/disable altivec block. 7 7 */ 8 8 9 - void __xor_altivec_2(unsigned long bytes, unsigned long *v1_in, 10 - unsigned long *v2_in); 11 - 12 - void __xor_altivec_3(unsigned long bytes, unsigned long *v1_in, 13 - unsigned long *v2_in, unsigned long *v3_in); 14 - 15 - void __xor_altivec_4(unsigned long bytes, unsigned long *v1_in, 16 - unsigned long *v2_in, unsigned long *v3_in, 17 - unsigned long *v4_in); 18 - 19 - void __xor_altivec_5(unsigned long bytes, unsigned long *v1_in, 20 - unsigned long *v2_in, unsigned long *v3_in, 21 - unsigned long *v4_in, unsigned long *v5_in); 9 + void __xor_altivec_2(unsigned long bytes, unsigned long * __restrict p1, 10 + const unsigned long * __restrict p2); 11 + void __xor_altivec_3(unsigned long bytes, unsigned long * __restrict p1, 12 + const unsigned long * __restrict p2, 13 + const unsigned long * __restrict p3); 14 + void __xor_altivec_4(unsigned long bytes, unsigned long * __restrict p1, 15 + const unsigned long * __restrict p2, 16 + const unsigned long * __restrict p3, 17 + const unsigned long * __restrict p4); 18 + void __xor_altivec_5(unsigned long bytes, unsigned long * __restrict p1, 19 + const unsigned long * __restrict p2, 20 + const unsigned long * __restrict p3, 21 + const unsigned long * __restrict p4, 22 + const unsigned long * __restrict p5);
+18 -14
arch/powerpc/lib/xor_vmx_glue.c
··· 12 12 #include <asm/xor_altivec.h> 13 13 #include "xor_vmx.h" 14 14 15 - void xor_altivec_2(unsigned long bytes, unsigned long *v1_in, 16 - unsigned long *v2_in) 15 + void xor_altivec_2(unsigned long bytes, unsigned long * __restrict p1, 16 + const unsigned long * __restrict p2) 17 17 { 18 18 preempt_disable(); 19 19 enable_kernel_altivec(); 20 - __xor_altivec_2(bytes, v1_in, v2_in); 20 + __xor_altivec_2(bytes, p1, p2); 21 21 disable_kernel_altivec(); 22 22 preempt_enable(); 23 23 } 24 24 EXPORT_SYMBOL(xor_altivec_2); 25 25 26 - void xor_altivec_3(unsigned long bytes, unsigned long *v1_in, 27 - unsigned long *v2_in, unsigned long *v3_in) 26 + void xor_altivec_3(unsigned long bytes, unsigned long * __restrict p1, 27 + const unsigned long * __restrict p2, 28 + const unsigned long * __restrict p3) 28 29 { 29 30 preempt_disable(); 30 31 enable_kernel_altivec(); 31 - __xor_altivec_3(bytes, v1_in, v2_in, v3_in); 32 + __xor_altivec_3(bytes, p1, p2, p3); 32 33 disable_kernel_altivec(); 33 34 preempt_enable(); 34 35 } 35 36 EXPORT_SYMBOL(xor_altivec_3); 36 37 37 - void xor_altivec_4(unsigned long bytes, unsigned long *v1_in, 38 - unsigned long *v2_in, unsigned long *v3_in, 39 - unsigned long *v4_in) 38 + void xor_altivec_4(unsigned long bytes, unsigned long * __restrict p1, 39 + const unsigned long * __restrict p2, 40 + const unsigned long * __restrict p3, 41 + const unsigned long * __restrict p4) 40 42 { 41 43 preempt_disable(); 42 44 enable_kernel_altivec(); 43 - __xor_altivec_4(bytes, v1_in, v2_in, v3_in, v4_in); 45 + __xor_altivec_4(bytes, p1, p2, p3, p4); 44 46 disable_kernel_altivec(); 45 47 preempt_enable(); 46 48 } 47 49 EXPORT_SYMBOL(xor_altivec_4); 48 50 49 - void xor_altivec_5(unsigned long bytes, unsigned long *v1_in, 50 - unsigned long *v2_in, unsigned long *v3_in, 51 - unsigned long *v4_in, unsigned long *v5_in) 51 + void xor_altivec_5(unsigned long bytes, unsigned long * __restrict p1, 52 + const unsigned long * __restrict p2, 53 + const unsigned long * __restrict p3, 54 + const unsigned long * __restrict p4, 55 + const unsigned long * __restrict p5) 52 56 { 53 57 preempt_disable(); 54 58 enable_kernel_altivec(); 55 - __xor_altivec_5(bytes, v1_in, v2_in, v3_in, v4_in, v5_in); 59 + __xor_altivec_5(bytes, p1, p2, p3, p4, p5); 56 60 disable_kernel_altivec(); 57 61 preempt_enable(); 58 62 }
+14 -7
arch/s390/lib/xor.c
··· 11 11 #include <linux/raid/xor.h> 12 12 #include <asm/xor.h> 13 13 14 - static void xor_xc_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 14 + static void xor_xc_2(unsigned long bytes, unsigned long * __restrict p1, 15 + const unsigned long * __restrict p2) 15 16 { 16 17 asm volatile( 17 18 " larl 1,2f\n" ··· 33 32 : "0", "1", "cc", "memory"); 34 33 } 35 34 36 - static void xor_xc_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 37 - unsigned long *p3) 35 + static void xor_xc_3(unsigned long bytes, unsigned long * __restrict p1, 36 + const unsigned long * __restrict p2, 37 + const unsigned long * __restrict p3) 38 38 { 39 39 asm volatile( 40 40 " larl 1,2f\n" ··· 60 58 : : "0", "1", "cc", "memory"); 61 59 } 62 60 63 - static void xor_xc_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 64 - unsigned long *p3, unsigned long *p4) 61 + static void xor_xc_4(unsigned long bytes, unsigned long * __restrict p1, 62 + const unsigned long * __restrict p2, 63 + const unsigned long * __restrict p3, 64 + const unsigned long * __restrict p4) 65 65 { 66 66 asm volatile( 67 67 " larl 1,2f\n" ··· 92 88 : : "0", "1", "cc", "memory"); 93 89 } 94 90 95 - static void xor_xc_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 96 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 91 + static void xor_xc_5(unsigned long bytes, unsigned long * __restrict p1, 92 + const unsigned long * __restrict p2, 93 + const unsigned long * __restrict p3, 94 + const unsigned long * __restrict p4, 95 + const unsigned long * __restrict p5) 97 96 { 98 97 asm volatile( 99 98 " larl 1,2f\n"
+14 -7
arch/sparc/include/asm/xor_32.h
··· 13 13 */ 14 14 15 15 static void 16 - sparc_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 16 + sparc_2(unsigned long bytes, unsigned long * __restrict p1, 17 + const unsigned long * __restrict p2) 17 18 { 18 19 int lines = bytes / (sizeof (long)) / 8; 19 20 ··· 51 50 } 52 51 53 52 static void 54 - sparc_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 55 - unsigned long *p3) 53 + sparc_3(unsigned long bytes, unsigned long * __restrict p1, 54 + const unsigned long * __restrict p2, 55 + const unsigned long * __restrict p3) 56 56 { 57 57 int lines = bytes / (sizeof (long)) / 8; 58 58 ··· 103 101 } 104 102 105 103 static void 106 - sparc_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 107 - unsigned long *p3, unsigned long *p4) 104 + sparc_4(unsigned long bytes, unsigned long * __restrict p1, 105 + const unsigned long * __restrict p2, 106 + const unsigned long * __restrict p3, 107 + const unsigned long * __restrict p4) 108 108 { 109 109 int lines = bytes / (sizeof (long)) / 8; 110 110 ··· 169 165 } 170 166 171 167 static void 172 - sparc_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 173 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 168 + sparc_5(unsigned long bytes, unsigned long * __restrict p1, 169 + const unsigned long * __restrict p2, 170 + const unsigned long * __restrict p3, 171 + const unsigned long * __restrict p4, 172 + const unsigned long * __restrict p5) 174 173 { 175 174 int lines = bytes / (sizeof (long)) / 8; 176 175
+28 -14
arch/sparc/include/asm/xor_64.h
··· 12 12 13 13 #include <asm/spitfire.h> 14 14 15 - void xor_vis_2(unsigned long, unsigned long *, unsigned long *); 16 - void xor_vis_3(unsigned long, unsigned long *, unsigned long *, 17 - unsigned long *); 18 - void xor_vis_4(unsigned long, unsigned long *, unsigned long *, 19 - unsigned long *, unsigned long *); 20 - void xor_vis_5(unsigned long, unsigned long *, unsigned long *, 21 - unsigned long *, unsigned long *, unsigned long *); 15 + void xor_vis_2(unsigned long bytes, unsigned long * __restrict p1, 16 + const unsigned long * __restrict p2); 17 + void xor_vis_3(unsigned long bytes, unsigned long * __restrict p1, 18 + const unsigned long * __restrict p2, 19 + const unsigned long * __restrict p3); 20 + void xor_vis_4(unsigned long bytes, unsigned long * __restrict p1, 21 + const unsigned long * __restrict p2, 22 + const unsigned long * __restrict p3, 23 + const unsigned long * __restrict p4); 24 + void xor_vis_5(unsigned long bytes, unsigned long * __restrict p1, 25 + const unsigned long * __restrict p2, 26 + const unsigned long * __restrict p3, 27 + const unsigned long * __restrict p4, 28 + const unsigned long * __restrict p5); 22 29 23 30 /* XXX Ugh, write cheetah versions... -DaveM */ 24 31 ··· 37 30 .do_5 = xor_vis_5, 38 31 }; 39 32 40 - void xor_niagara_2(unsigned long, unsigned long *, unsigned long *); 41 - void xor_niagara_3(unsigned long, unsigned long *, unsigned long *, 42 - unsigned long *); 43 - void xor_niagara_4(unsigned long, unsigned long *, unsigned long *, 44 - unsigned long *, unsigned long *); 45 - void xor_niagara_5(unsigned long, unsigned long *, unsigned long *, 46 - unsigned long *, unsigned long *, unsigned long *); 33 + void xor_niagara_2(unsigned long bytes, unsigned long * __restrict p1, 34 + const unsigned long * __restrict p2); 35 + void xor_niagara_3(unsigned long bytes, unsigned long * __restrict p1, 36 + const unsigned long * __restrict p2, 37 + const unsigned long * __restrict p3); 38 + void xor_niagara_4(unsigned long bytes, unsigned long * __restrict p1, 39 + const unsigned long * __restrict p2, 40 + const unsigned long * __restrict p3, 41 + const unsigned long * __restrict p4); 42 + void xor_niagara_5(unsigned long bytes, unsigned long * __restrict p1, 43 + const unsigned long * __restrict p2, 44 + const unsigned long * __restrict p3, 45 + const unsigned long * __restrict p4, 46 + const unsigned long * __restrict p5); 47 47 48 48 static struct xor_block_template xor_block_niagara = { 49 49 .name = "Niagara",
+28 -14
arch/x86/include/asm/xor.h
··· 57 57 op(i + 3, 3) 58 58 59 59 static void 60 - xor_sse_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 60 + xor_sse_2(unsigned long bytes, unsigned long * __restrict p1, 61 + const unsigned long * __restrict p2) 61 62 { 62 63 unsigned long lines = bytes >> 8; 63 64 ··· 109 108 } 110 109 111 110 static void 112 - xor_sse_2_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2) 111 + xor_sse_2_pf64(unsigned long bytes, unsigned long * __restrict p1, 112 + const unsigned long * __restrict p2) 113 113 { 114 114 unsigned long lines = bytes >> 8; 115 115 ··· 144 142 } 145 143 146 144 static void 147 - xor_sse_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 148 - unsigned long *p3) 145 + xor_sse_3(unsigned long bytes, unsigned long * __restrict p1, 146 + const unsigned long * __restrict p2, 147 + const unsigned long * __restrict p3) 149 148 { 150 149 unsigned long lines = bytes >> 8; 151 150 ··· 204 201 } 205 202 206 203 static void 207 - xor_sse_3_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, 208 - unsigned long *p3) 204 + xor_sse_3_pf64(unsigned long bytes, unsigned long * __restrict p1, 205 + const unsigned long * __restrict p2, 206 + const unsigned long * __restrict p3) 209 207 { 210 208 unsigned long lines = bytes >> 8; 211 209 ··· 242 238 } 243 239 244 240 static void 245 - xor_sse_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 246 - unsigned long *p3, unsigned long *p4) 241 + xor_sse_4(unsigned long bytes, unsigned long * __restrict p1, 242 + const unsigned long * __restrict p2, 243 + const unsigned long * __restrict p3, 244 + const unsigned long * __restrict p4) 247 245 { 248 246 unsigned long lines = bytes >> 8; 249 247 ··· 310 304 } 311 305 312 306 static void 313 - xor_sse_4_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, 314 - unsigned long *p3, unsigned long *p4) 307 + xor_sse_4_pf64(unsigned long bytes, unsigned long * __restrict p1, 308 + const unsigned long * __restrict p2, 309 + const unsigned long * __restrict p3, 310 + const unsigned long * __restrict p4) 315 311 { 316 312 unsigned long lines = bytes >> 8; 317 313 ··· 351 343 } 352 344 353 345 static void 354 - xor_sse_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 355 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 346 + xor_sse_5(unsigned long bytes, unsigned long * __restrict p1, 347 + const unsigned long * __restrict p2, 348 + const unsigned long * __restrict p3, 349 + const unsigned long * __restrict p4, 350 + const unsigned long * __restrict p5) 356 351 { 357 352 unsigned long lines = bytes >> 8; 358 353 ··· 427 416 } 428 417 429 418 static void 430 - xor_sse_5_pf64(unsigned long bytes, unsigned long *p1, unsigned long *p2, 431 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 419 + xor_sse_5_pf64(unsigned long bytes, unsigned long * __restrict p1, 420 + const unsigned long * __restrict p2, 421 + const unsigned long * __restrict p3, 422 + const unsigned long * __restrict p4, 423 + const unsigned long * __restrict p5) 432 424 { 433 425 unsigned long lines = bytes >> 8; 434 426
+28 -14
arch/x86/include/asm/xor_32.h
··· 21 21 #include <asm/fpu/api.h> 22 22 23 23 static void 24 - xor_pII_mmx_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 24 + xor_pII_mmx_2(unsigned long bytes, unsigned long * __restrict p1, 25 + const unsigned long * __restrict p2) 25 26 { 26 27 unsigned long lines = bytes >> 7; 27 28 ··· 65 64 } 66 65 67 66 static void 68 - xor_pII_mmx_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 69 - unsigned long *p3) 67 + xor_pII_mmx_3(unsigned long bytes, unsigned long * __restrict p1, 68 + const unsigned long * __restrict p2, 69 + const unsigned long * __restrict p3) 70 70 { 71 71 unsigned long lines = bytes >> 7; 72 72 ··· 115 113 } 116 114 117 115 static void 118 - xor_pII_mmx_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 119 - unsigned long *p3, unsigned long *p4) 116 + xor_pII_mmx_4(unsigned long bytes, unsigned long * __restrict p1, 117 + const unsigned long * __restrict p2, 118 + const unsigned long * __restrict p3, 119 + const unsigned long * __restrict p4) 120 120 { 121 121 unsigned long lines = bytes >> 7; 122 122 ··· 172 168 173 169 174 170 static void 175 - xor_pII_mmx_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 176 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 171 + xor_pII_mmx_5(unsigned long bytes, unsigned long * __restrict p1, 172 + const unsigned long * __restrict p2, 173 + const unsigned long * __restrict p3, 174 + const unsigned long * __restrict p4, 175 + const unsigned long * __restrict p5) 177 176 { 178 177 unsigned long lines = bytes >> 7; 179 178 ··· 255 248 #undef BLOCK 256 249 257 250 static void 258 - xor_p5_mmx_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 251 + xor_p5_mmx_2(unsigned long bytes, unsigned long * __restrict p1, 252 + const unsigned long * __restrict p2) 259 253 { 260 254 unsigned long lines = bytes >> 6; 261 255 ··· 303 295 } 304 296 305 297 static void 306 - xor_p5_mmx_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 307 - unsigned long *p3) 298 + xor_p5_mmx_3(unsigned long bytes, unsigned long * __restrict p1, 299 + const unsigned long * __restrict p2, 300 + const unsigned long * __restrict p3) 308 301 { 309 302 unsigned long lines = bytes >> 6; 310 303 ··· 361 352 } 362 353 363 354 static void 364 - xor_p5_mmx_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 365 - unsigned long *p3, unsigned long *p4) 355 + xor_p5_mmx_4(unsigned long bytes, unsigned long * __restrict p1, 356 + const unsigned long * __restrict p2, 357 + const unsigned long * __restrict p3, 358 + const unsigned long * __restrict p4) 366 359 { 367 360 unsigned long lines = bytes >> 6; 368 361 ··· 429 418 } 430 419 431 420 static void 432 - xor_p5_mmx_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 433 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 421 + xor_p5_mmx_5(unsigned long bytes, unsigned long * __restrict p1, 422 + const unsigned long * __restrict p2, 423 + const unsigned long * __restrict p3, 424 + const unsigned long * __restrict p4, 425 + const unsigned long * __restrict p5) 434 426 { 435 427 unsigned long lines = bytes >> 6; 436 428
+14 -7
arch/x86/include/asm/xor_avx.h
··· 26 26 BLOCK4(8) \ 27 27 BLOCK4(12) 28 28 29 - static void xor_avx_2(unsigned long bytes, unsigned long *p0, unsigned long *p1) 29 + static void xor_avx_2(unsigned long bytes, unsigned long * __restrict p0, 30 + const unsigned long * __restrict p1) 30 31 { 31 32 unsigned long lines = bytes >> 9; 32 33 ··· 53 52 kernel_fpu_end(); 54 53 } 55 54 56 - static void xor_avx_3(unsigned long bytes, unsigned long *p0, unsigned long *p1, 57 - unsigned long *p2) 55 + static void xor_avx_3(unsigned long bytes, unsigned long * __restrict p0, 56 + const unsigned long * __restrict p1, 57 + const unsigned long * __restrict p2) 58 58 { 59 59 unsigned long lines = bytes >> 9; 60 60 ··· 84 82 kernel_fpu_end(); 85 83 } 86 84 87 - static void xor_avx_4(unsigned long bytes, unsigned long *p0, unsigned long *p1, 88 - unsigned long *p2, unsigned long *p3) 85 + static void xor_avx_4(unsigned long bytes, unsigned long * __restrict p0, 86 + const unsigned long * __restrict p1, 87 + const unsigned long * __restrict p2, 88 + const unsigned long * __restrict p3) 89 89 { 90 90 unsigned long lines = bytes >> 9; 91 91 ··· 119 115 kernel_fpu_end(); 120 116 } 121 117 122 - static void xor_avx_5(unsigned long bytes, unsigned long *p0, unsigned long *p1, 123 - unsigned long *p2, unsigned long *p3, unsigned long *p4) 118 + static void xor_avx_5(unsigned long bytes, unsigned long * __restrict p0, 119 + const unsigned long * __restrict p1, 120 + const unsigned long * __restrict p2, 121 + const unsigned long * __restrict p3, 122 + const unsigned long * __restrict p4) 124 123 { 125 124 unsigned long lines = bytes >> 9; 126 125
+56 -28
include/asm-generic/xor.h
··· 8 8 #include <linux/prefetch.h> 9 9 10 10 static void 11 - xor_8regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 11 + xor_8regs_2(unsigned long bytes, unsigned long * __restrict p1, 12 + const unsigned long * __restrict p2) 12 13 { 13 14 long lines = bytes / (sizeof (long)) / 8; 14 15 ··· 28 27 } 29 28 30 29 static void 31 - xor_8regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 32 - unsigned long *p3) 30 + xor_8regs_3(unsigned long bytes, unsigned long * __restrict p1, 31 + const unsigned long * __restrict p2, 32 + const unsigned long * __restrict p3) 33 33 { 34 34 long lines = bytes / (sizeof (long)) / 8; 35 35 ··· 50 48 } 51 49 52 50 static void 53 - xor_8regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 54 - unsigned long *p3, unsigned long *p4) 51 + xor_8regs_4(unsigned long bytes, unsigned long * __restrict p1, 52 + const unsigned long * __restrict p2, 53 + const unsigned long * __restrict p3, 54 + const unsigned long * __restrict p4) 55 55 { 56 56 long lines = bytes / (sizeof (long)) / 8; 57 57 ··· 74 70 } 75 71 76 72 static void 77 - xor_8regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 78 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 73 + xor_8regs_5(unsigned long bytes, unsigned long * __restrict p1, 74 + const unsigned long * __restrict p2, 75 + const unsigned long * __restrict p3, 76 + const unsigned long * __restrict p4, 77 + const unsigned long * __restrict p5) 79 78 { 80 79 long lines = bytes / (sizeof (long)) / 8; 81 80 ··· 100 93 } 101 94 102 95 static void 103 - xor_32regs_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 96 + xor_32regs_2(unsigned long bytes, unsigned long * __restrict p1, 97 + const unsigned long * __restrict p2) 104 98 { 105 99 long lines = bytes / (sizeof (long)) / 8; 106 100 ··· 137 129 } 138 130 139 131 static void 140 - xor_32regs_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 141 - unsigned long *p3) 132 + xor_32regs_3(unsigned long bytes, unsigned long * __restrict p1, 133 + const unsigned long * __restrict p2, 134 + const unsigned long * __restrict p3) 142 135 { 143 136 long lines = bytes / (sizeof (long)) / 8; 144 137 ··· 184 175 } 185 176 186 177 static void 187 - xor_32regs_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 188 - unsigned long *p3, unsigned long *p4) 178 + xor_32regs_4(unsigned long bytes, unsigned long * __restrict p1, 179 + const unsigned long * __restrict p2, 180 + const unsigned long * __restrict p3, 181 + const unsigned long * __restrict p4) 189 182 { 190 183 long lines = bytes / (sizeof (long)) / 8; 191 184 ··· 241 230 } 242 231 243 232 static void 244 - xor_32regs_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 245 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 233 + xor_32regs_5(unsigned long bytes, unsigned long * __restrict p1, 234 + const unsigned long * __restrict p2, 235 + const unsigned long * __restrict p3, 236 + const unsigned long * __restrict p4, 237 + const unsigned long * __restrict p5) 246 238 { 247 239 long lines = bytes / (sizeof (long)) / 8; 248 240 ··· 308 294 } 309 295 310 296 static void 311 - xor_8regs_p_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 297 + xor_8regs_p_2(unsigned long bytes, unsigned long * __restrict p1, 298 + const unsigned long * __restrict p2) 312 299 { 313 300 long lines = bytes / (sizeof (long)) / 8 - 1; 314 301 prefetchw(p1); ··· 335 320 } 336 321 337 322 static void 338 - xor_8regs_p_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 339 - unsigned long *p3) 323 + xor_8regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 324 + const unsigned long * __restrict p2, 325 + const unsigned long * __restrict p3) 340 326 { 341 327 long lines = bytes / (sizeof (long)) / 8 - 1; 342 328 prefetchw(p1); ··· 366 350 } 367 351 368 352 static void 369 - xor_8regs_p_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 370 - unsigned long *p3, unsigned long *p4) 353 + xor_8regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 354 + const unsigned long * __restrict p2, 355 + const unsigned long * __restrict p3, 356 + const unsigned long * __restrict p4) 371 357 { 372 358 long lines = bytes / (sizeof (long)) / 8 - 1; 373 359 ··· 402 384 } 403 385 404 386 static void 405 - xor_8regs_p_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 406 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 387 + xor_8regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 388 + const unsigned long * __restrict p2, 389 + const unsigned long * __restrict p3, 390 + const unsigned long * __restrict p4, 391 + const unsigned long * __restrict p5) 407 392 { 408 393 long lines = bytes / (sizeof (long)) / 8 - 1; 409 394 ··· 442 421 } 443 422 444 423 static void 445 - xor_32regs_p_2(unsigned long bytes, unsigned long *p1, unsigned long *p2) 424 + xor_32regs_p_2(unsigned long bytes, unsigned long * __restrict p1, 425 + const unsigned long * __restrict p2) 446 426 { 447 427 long lines = bytes / (sizeof (long)) / 8 - 1; 448 428 ··· 488 466 } 489 467 490 468 static void 491 - xor_32regs_p_3(unsigned long bytes, unsigned long *p1, unsigned long *p2, 492 - unsigned long *p3) 469 + xor_32regs_p_3(unsigned long bytes, unsigned long * __restrict p1, 470 + const unsigned long * __restrict p2, 471 + const unsigned long * __restrict p3) 493 472 { 494 473 long lines = bytes / (sizeof (long)) / 8 - 1; 495 474 ··· 546 523 } 547 524 548 525 static void 549 - xor_32regs_p_4(unsigned long bytes, unsigned long *p1, unsigned long *p2, 550 - unsigned long *p3, unsigned long *p4) 526 + xor_32regs_p_4(unsigned long bytes, unsigned long * __restrict p1, 527 + const unsigned long * __restrict p2, 528 + const unsigned long * __restrict p3, 529 + const unsigned long * __restrict p4) 551 530 { 552 531 long lines = bytes / (sizeof (long)) / 8 - 1; 553 532 ··· 616 591 } 617 592 618 593 static void 619 - xor_32regs_p_5(unsigned long bytes, unsigned long *p1, unsigned long *p2, 620 - unsigned long *p3, unsigned long *p4, unsigned long *p5) 594 + xor_32regs_p_5(unsigned long bytes, unsigned long * __restrict p1, 595 + const unsigned long * __restrict p2, 596 + const unsigned long * __restrict p3, 597 + const unsigned long * __restrict p4, 598 + const unsigned long * __restrict p5) 621 599 { 622 600 long lines = bytes / (sizeof (long)) / 8 - 1; 623 601
+14 -7
include/linux/raid/xor.h
··· 11 11 struct xor_block_template *next; 12 12 const char *name; 13 13 int speed; 14 - void (*do_2)(unsigned long, unsigned long *, unsigned long *); 15 - void (*do_3)(unsigned long, unsigned long *, unsigned long *, 16 - unsigned long *); 17 - void (*do_4)(unsigned long, unsigned long *, unsigned long *, 18 - unsigned long *, unsigned long *); 19 - void (*do_5)(unsigned long, unsigned long *, unsigned long *, 20 - unsigned long *, unsigned long *, unsigned long *); 14 + void (*do_2)(unsigned long, unsigned long * __restrict, 15 + const unsigned long * __restrict); 16 + void (*do_3)(unsigned long, unsigned long * __restrict, 17 + const unsigned long * __restrict, 18 + const unsigned long * __restrict); 19 + void (*do_4)(unsigned long, unsigned long * __restrict, 20 + const unsigned long * __restrict, 21 + const unsigned long * __restrict, 22 + const unsigned long * __restrict); 23 + void (*do_5)(unsigned long, unsigned long * __restrict, 24 + const unsigned long * __restrict, 25 + const unsigned long * __restrict, 26 + const unsigned long * __restrict, 27 + const unsigned long * __restrict); 21 28 }; 22 29 23 30 #endif