Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0-or-later */
0002 /*
0003  * include/asm/xor.h
0004  *
0005  * Optimized RAID-5 checksumming functions for 32-bit Sparc.
0006  */
0007 
0008 /*
0009  * High speed xor_block operation for RAID4/5 utilizing the
0010  * ldd/std SPARC instructions.
0011  *
0012  * Copyright (C) 1999 Jakub Jelinek (jj@ultra.linux.cz)
0013  */
0014 
0015 static void
0016 sparc_2(unsigned long bytes, unsigned long * __restrict p1,
0017     const unsigned long * __restrict p2)
0018 {
0019     int lines = bytes / (sizeof (long)) / 8;
0020 
0021     do {
0022         __asm__ __volatile__(
0023           "ldd [%0 + 0x00], %%g2\n\t"
0024           "ldd [%0 + 0x08], %%g4\n\t"
0025           "ldd [%0 + 0x10], %%o0\n\t"
0026           "ldd [%0 + 0x18], %%o2\n\t"
0027           "ldd [%1 + 0x00], %%o4\n\t"
0028           "ldd [%1 + 0x08], %%l0\n\t"
0029           "ldd [%1 + 0x10], %%l2\n\t"
0030           "ldd [%1 + 0x18], %%l4\n\t"
0031           "xor %%g2, %%o4, %%g2\n\t"
0032           "xor %%g3, %%o5, %%g3\n\t"
0033           "xor %%g4, %%l0, %%g4\n\t"
0034           "xor %%g5, %%l1, %%g5\n\t"
0035           "xor %%o0, %%l2, %%o0\n\t"
0036           "xor %%o1, %%l3, %%o1\n\t"
0037           "xor %%o2, %%l4, %%o2\n\t"
0038           "xor %%o3, %%l5, %%o3\n\t"
0039           "std %%g2, [%0 + 0x00]\n\t"
0040           "std %%g4, [%0 + 0x08]\n\t"
0041           "std %%o0, [%0 + 0x10]\n\t"
0042           "std %%o2, [%0 + 0x18]\n"
0043         :
0044         : "r" (p1), "r" (p2)
0045         : "g2", "g3", "g4", "g5",
0046           "o0", "o1", "o2", "o3", "o4", "o5",
0047           "l0", "l1", "l2", "l3", "l4", "l5");
0048         p1 += 8;
0049         p2 += 8;
0050     } while (--lines > 0);
0051 }
0052 
0053 static void
0054 sparc_3(unsigned long bytes, unsigned long * __restrict p1,
0055     const unsigned long * __restrict p2,
0056     const unsigned long * __restrict p3)
0057 {
0058     int lines = bytes / (sizeof (long)) / 8;
0059 
0060     do {
0061         __asm__ __volatile__(
0062           "ldd [%0 + 0x00], %%g2\n\t"
0063           "ldd [%0 + 0x08], %%g4\n\t"
0064           "ldd [%0 + 0x10], %%o0\n\t"
0065           "ldd [%0 + 0x18], %%o2\n\t"
0066           "ldd [%1 + 0x00], %%o4\n\t"
0067           "ldd [%1 + 0x08], %%l0\n\t"
0068           "ldd [%1 + 0x10], %%l2\n\t"
0069           "ldd [%1 + 0x18], %%l4\n\t"
0070           "xor %%g2, %%o4, %%g2\n\t"
0071           "xor %%g3, %%o5, %%g3\n\t"
0072           "ldd [%2 + 0x00], %%o4\n\t"
0073           "xor %%g4, %%l0, %%g4\n\t"
0074           "xor %%g5, %%l1, %%g5\n\t"
0075           "ldd [%2 + 0x08], %%l0\n\t"
0076           "xor %%o0, %%l2, %%o0\n\t"
0077           "xor %%o1, %%l3, %%o1\n\t"
0078           "ldd [%2 + 0x10], %%l2\n\t"
0079           "xor %%o2, %%l4, %%o2\n\t"
0080           "xor %%o3, %%l5, %%o3\n\t"
0081           "ldd [%2 + 0x18], %%l4\n\t"
0082           "xor %%g2, %%o4, %%g2\n\t"
0083           "xor %%g3, %%o5, %%g3\n\t"
0084           "xor %%g4, %%l0, %%g4\n\t"
0085           "xor %%g5, %%l1, %%g5\n\t"
0086           "xor %%o0, %%l2, %%o0\n\t"
0087           "xor %%o1, %%l3, %%o1\n\t"
0088           "xor %%o2, %%l4, %%o2\n\t"
0089           "xor %%o3, %%l5, %%o3\n\t"
0090           "std %%g2, [%0 + 0x00]\n\t"
0091           "std %%g4, [%0 + 0x08]\n\t"
0092           "std %%o0, [%0 + 0x10]\n\t"
0093           "std %%o2, [%0 + 0x18]\n"
0094         :
0095         : "r" (p1), "r" (p2), "r" (p3)
0096         : "g2", "g3", "g4", "g5",
0097           "o0", "o1", "o2", "o3", "o4", "o5",
0098           "l0", "l1", "l2", "l3", "l4", "l5");
0099         p1 += 8;
0100         p2 += 8;
0101         p3 += 8;
0102     } while (--lines > 0);
0103 }
0104 
0105 static void
0106 sparc_4(unsigned long bytes, unsigned long * __restrict p1,
0107     const unsigned long * __restrict p2,
0108     const unsigned long * __restrict p3,
0109     const unsigned long * __restrict p4)
0110 {
0111     int lines = bytes / (sizeof (long)) / 8;
0112 
0113     do {
0114         __asm__ __volatile__(
0115           "ldd [%0 + 0x00], %%g2\n\t"
0116           "ldd [%0 + 0x08], %%g4\n\t"
0117           "ldd [%0 + 0x10], %%o0\n\t"
0118           "ldd [%0 + 0x18], %%o2\n\t"
0119           "ldd [%1 + 0x00], %%o4\n\t"
0120           "ldd [%1 + 0x08], %%l0\n\t"
0121           "ldd [%1 + 0x10], %%l2\n\t"
0122           "ldd [%1 + 0x18], %%l4\n\t"
0123           "xor %%g2, %%o4, %%g2\n\t"
0124           "xor %%g3, %%o5, %%g3\n\t"
0125           "ldd [%2 + 0x00], %%o4\n\t"
0126           "xor %%g4, %%l0, %%g4\n\t"
0127           "xor %%g5, %%l1, %%g5\n\t"
0128           "ldd [%2 + 0x08], %%l0\n\t"
0129           "xor %%o0, %%l2, %%o0\n\t"
0130           "xor %%o1, %%l3, %%o1\n\t"
0131           "ldd [%2 + 0x10], %%l2\n\t"
0132           "xor %%o2, %%l4, %%o2\n\t"
0133           "xor %%o3, %%l5, %%o3\n\t"
0134           "ldd [%2 + 0x18], %%l4\n\t"
0135           "xor %%g2, %%o4, %%g2\n\t"
0136           "xor %%g3, %%o5, %%g3\n\t"
0137           "ldd [%3 + 0x00], %%o4\n\t"
0138           "xor %%g4, %%l0, %%g4\n\t"
0139           "xor %%g5, %%l1, %%g5\n\t"
0140           "ldd [%3 + 0x08], %%l0\n\t"
0141           "xor %%o0, %%l2, %%o0\n\t"
0142           "xor %%o1, %%l3, %%o1\n\t"
0143           "ldd [%3 + 0x10], %%l2\n\t"
0144           "xor %%o2, %%l4, %%o2\n\t"
0145           "xor %%o3, %%l5, %%o3\n\t"
0146           "ldd [%3 + 0x18], %%l4\n\t"
0147           "xor %%g2, %%o4, %%g2\n\t"
0148           "xor %%g3, %%o5, %%g3\n\t"
0149           "xor %%g4, %%l0, %%g4\n\t"
0150           "xor %%g5, %%l1, %%g5\n\t"
0151           "xor %%o0, %%l2, %%o0\n\t"
0152           "xor %%o1, %%l3, %%o1\n\t"
0153           "xor %%o2, %%l4, %%o2\n\t"
0154           "xor %%o3, %%l5, %%o3\n\t"
0155           "std %%g2, [%0 + 0x00]\n\t"
0156           "std %%g4, [%0 + 0x08]\n\t"
0157           "std %%o0, [%0 + 0x10]\n\t"
0158           "std %%o2, [%0 + 0x18]\n"
0159         :
0160         : "r" (p1), "r" (p2), "r" (p3), "r" (p4)
0161         : "g2", "g3", "g4", "g5",
0162           "o0", "o1", "o2", "o3", "o4", "o5",
0163           "l0", "l1", "l2", "l3", "l4", "l5");
0164         p1 += 8;
0165         p2 += 8;
0166         p3 += 8;
0167         p4 += 8;
0168     } while (--lines > 0);
0169 }
0170 
0171 static void
0172 sparc_5(unsigned long bytes, unsigned long * __restrict p1,
0173     const unsigned long * __restrict p2,
0174     const unsigned long * __restrict p3,
0175     const unsigned long * __restrict p4,
0176     const unsigned long * __restrict p5)
0177 {
0178     int lines = bytes / (sizeof (long)) / 8;
0179 
0180     do {
0181         __asm__ __volatile__(
0182           "ldd [%0 + 0x00], %%g2\n\t"
0183           "ldd [%0 + 0x08], %%g4\n\t"
0184           "ldd [%0 + 0x10], %%o0\n\t"
0185           "ldd [%0 + 0x18], %%o2\n\t"
0186           "ldd [%1 + 0x00], %%o4\n\t"
0187           "ldd [%1 + 0x08], %%l0\n\t"
0188           "ldd [%1 + 0x10], %%l2\n\t"
0189           "ldd [%1 + 0x18], %%l4\n\t"
0190           "xor %%g2, %%o4, %%g2\n\t"
0191           "xor %%g3, %%o5, %%g3\n\t"
0192           "ldd [%2 + 0x00], %%o4\n\t"
0193           "xor %%g4, %%l0, %%g4\n\t"
0194           "xor %%g5, %%l1, %%g5\n\t"
0195           "ldd [%2 + 0x08], %%l0\n\t"
0196           "xor %%o0, %%l2, %%o0\n\t"
0197           "xor %%o1, %%l3, %%o1\n\t"
0198           "ldd [%2 + 0x10], %%l2\n\t"
0199           "xor %%o2, %%l4, %%o2\n\t"
0200           "xor %%o3, %%l5, %%o3\n\t"
0201           "ldd [%2 + 0x18], %%l4\n\t"
0202           "xor %%g2, %%o4, %%g2\n\t"
0203           "xor %%g3, %%o5, %%g3\n\t"
0204           "ldd [%3 + 0x00], %%o4\n\t"
0205           "xor %%g4, %%l0, %%g4\n\t"
0206           "xor %%g5, %%l1, %%g5\n\t"
0207           "ldd [%3 + 0x08], %%l0\n\t"
0208           "xor %%o0, %%l2, %%o0\n\t"
0209           "xor %%o1, %%l3, %%o1\n\t"
0210           "ldd [%3 + 0x10], %%l2\n\t"
0211           "xor %%o2, %%l4, %%o2\n\t"
0212           "xor %%o3, %%l5, %%o3\n\t"
0213           "ldd [%3 + 0x18], %%l4\n\t"
0214           "xor %%g2, %%o4, %%g2\n\t"
0215           "xor %%g3, %%o5, %%g3\n\t"
0216           "ldd [%4 + 0x00], %%o4\n\t"
0217           "xor %%g4, %%l0, %%g4\n\t"
0218           "xor %%g5, %%l1, %%g5\n\t"
0219           "ldd [%4 + 0x08], %%l0\n\t"
0220           "xor %%o0, %%l2, %%o0\n\t"
0221           "xor %%o1, %%l3, %%o1\n\t"
0222           "ldd [%4 + 0x10], %%l2\n\t"
0223           "xor %%o2, %%l4, %%o2\n\t"
0224           "xor %%o3, %%l5, %%o3\n\t"
0225           "ldd [%4 + 0x18], %%l4\n\t"
0226           "xor %%g2, %%o4, %%g2\n\t"
0227           "xor %%g3, %%o5, %%g3\n\t"
0228           "xor %%g4, %%l0, %%g4\n\t"
0229           "xor %%g5, %%l1, %%g5\n\t"
0230           "xor %%o0, %%l2, %%o0\n\t"
0231           "xor %%o1, %%l3, %%o1\n\t"
0232           "xor %%o2, %%l4, %%o2\n\t"
0233           "xor %%o3, %%l5, %%o3\n\t"
0234           "std %%g2, [%0 + 0x00]\n\t"
0235           "std %%g4, [%0 + 0x08]\n\t"
0236           "std %%o0, [%0 + 0x10]\n\t"
0237           "std %%o2, [%0 + 0x18]\n"
0238         :
0239         : "r" (p1), "r" (p2), "r" (p3), "r" (p4), "r" (p5)
0240         : "g2", "g3", "g4", "g5",
0241           "o0", "o1", "o2", "o3", "o4", "o5",
0242           "l0", "l1", "l2", "l3", "l4", "l5");
0243         p1 += 8;
0244         p2 += 8;
0245         p3 += 8;
0246         p4 += 8;
0247         p5 += 8;
0248     } while (--lines > 0);
0249 }
0250 
0251 static struct xor_block_template xor_block_SPARC = {
0252     .name   = "SPARC",
0253     .do_2   = sparc_2,
0254     .do_3   = sparc_3,
0255     .do_4   = sparc_4,
0256     .do_5   = sparc_5,
0257 };
0258 
0259 /* For grins, also test the generic routines.  */
0260 #include <asm-generic/xor.h>
0261 
0262 #undef XOR_TRY_TEMPLATES
0263 #define XOR_TRY_TEMPLATES               \
0264     do {                        \
0265         xor_speed(&xor_block_8regs);        \
0266         xor_speed(&xor_block_32regs);       \
0267         xor_speed(&xor_block_SPARC);        \
0268     } while (0)