0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
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
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)