LCOV - code coverage report
Current view: top level - raid - x86.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 1533 1533 100.0 %
Date: 2017-11-06 22:14:04 Functions: 23 23 100.0 %

          Line data    Source code
       1             : /*
       2             :  * Copyright (C) 2013 Andrea Mazzoleni
       3             :  *
       4             :  * This program is free software: you can redistribute it and/or modify
       5             :  * it under the terms of the GNU General Public License as published by
       6             :  * the Free Software Foundation, either version 2 of the License, or
       7             :  * (at your option) any later version.
       8             :  *
       9             :  * This program is distributed in the hope that it will be useful,
      10             :  * but WITHOUT ANY WARRANTY; without even the implied warranty of
      11             :  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12             :  * GNU General Public License for more details.
      13             :  */
      14             : 
      15             : #include "internal.h"
      16             : #include "gf.h"
      17             : 
      18             : /*
      19             :  * For x86 optimizations you can see:
      20             :  *
      21             :  * Software optimization resources
      22             :  * http://www.agner.org/optimize/
      23             :  *
      24             :  * x86, x64 Instruction Latency, Memory Latency and CPUID dumps
      25             :  * http://users.atw.hu/instlatx64/
      26             :  */
      27             : 
      28             : #if defined(CONFIG_X86) && defined(CONFIG_SSE2)
      29             : /*
      30             :  * GEN1 (RAID5 with xor) SSE2 implementation
      31             :  *
      32             :  * Intentionally don't process more than 64 bytes because 64 is the typical
      33             :  * cache block, and processing 128 bytes doesn't increase performance, and in
      34             :  * some cases it even decreases it.
      35             :  */
      36      288623 : void raid_gen1_sse2(int nd, size_t size, void **vv)
      37             : {
      38      288623 :         uint8_t **v = (uint8_t **)vv;
      39             :         uint8_t *p;
      40             :         int d, l;
      41             :         size_t i;
      42             : 
      43      288623 :         l = nd - 1;
      44      288623 :         p = v[nd];
      45             : 
      46             :         raid_sse_begin();
      47             : 
      48     5714395 :         for (i = 0; i < size; i += 64) {
      49     5425772 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (v[l][i]));
      50     5425772 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (v[l][i + 16]));
      51     5425772 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (v[l][i + 32]));
      52     5425772 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (v[l][i + 48]));
      53    34176836 :                 for (d = l - 1; d >= 0; --d) {
      54    28751064 :                         asm volatile ("pxor %0,%%xmm0" : : "m" (v[d][i]));
      55    28751064 :                         asm volatile ("pxor %0,%%xmm1" : : "m" (v[d][i + 16]));
      56    28751064 :                         asm volatile ("pxor %0,%%xmm2" : : "m" (v[d][i + 32]));
      57    28751064 :                         asm volatile ("pxor %0,%%xmm3" : : "m" (v[d][i + 48]));
      58             :                 }
      59     5425772 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
      60     5425772 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (p[i + 16]));
      61     5425772 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (p[i + 32]));
      62     5425772 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (p[i + 48]));
      63             :         }
      64             : 
      65             :         raid_sse_end();
      66      288623 : }
      67             : #endif
      68             : 
      69             : #if defined(CONFIG_X86) && defined(CONFIG_AVX2)
      70             : /*
      71             :  * GEN1 (RAID5 with xor) AVX2 implementation
      72             :  *
      73             :  * Intentionally don't process more than 64 bytes because 64 is the typical
      74             :  * cache block, and processing 128 bytes doesn't increase performance, and in
      75             :  * some cases it even decreases it.
      76             :  */
      77          86 : void raid_gen1_avx2(int nd, size_t size, void **vv)
      78             : {
      79          86 :         uint8_t **v = (uint8_t **)vv;
      80             :         uint8_t *p;
      81             :         int d, l;
      82             :         size_t i;
      83             : 
      84          86 :         l = nd - 1;
      85          86 :         p = v[nd];
      86             : 
      87             :         raid_avx_begin();
      88             : 
      89        5122 :         for (i = 0; i < size; i += 64) {
      90        5036 :                 asm volatile ("vmovdqa %0,%%ymm0" : : "m" (v[l][i]));
      91        5036 :                 asm volatile ("vmovdqa %0,%%ymm1" : : "m" (v[l][i + 32]));
      92       46724 :                 for (d = l - 1; d >= 0; --d) {
      93       41688 :                         asm volatile ("vpxor %0,%%ymm0,%%ymm0" : : "m" (v[d][i]));
      94       41688 :                         asm volatile ("vpxor %0,%%ymm1,%%ymm1" : : "m" (v[d][i + 32]));
      95             :                 }
      96        5036 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
      97        5036 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (p[i + 32]));
      98             :         }
      99             : 
     100             :         raid_avx_end();
     101          86 : }
     102             : #endif
     103             : 
     104             : #if defined(CONFIG_X86) && defined(CONFIG_SSE2)
     105             : static const struct gfconst16 {
     106             :         uint8_t poly[16];
     107             :         uint8_t low4[16];
     108             : } gfconst16 __aligned(32) = {
     109             :         {
     110             :                 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d,
     111             :                 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d, 0x1d
     112             :         },
     113             :         {
     114             :                 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
     115             :                 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f
     116             :         },
     117             : };
     118             : #endif
     119             : 
     120             : #if defined(CONFIG_X86) && defined(CONFIG_SSE2)
     121             : /*
     122             :  * GEN2 (RAID6 with powers of 2) SSE2 implementation
     123             :  */
     124         145 : void raid_gen2_sse2(int nd, size_t size, void **vv)
     125             : {
     126         145 :         uint8_t **v = (uint8_t **)vv;
     127             :         uint8_t *p;
     128             :         uint8_t *q;
     129             :         int d, l;
     130             :         size_t i;
     131             : 
     132         145 :         l = nd - 1;
     133         145 :         p = v[nd];
     134         145 :         q = v[nd + 1];
     135             : 
     136             :         raid_sse_begin();
     137             : 
     138         145 :         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
     139             : 
     140     1163433 :         for (i = 0; i < size; i += 32) {
     141     1163288 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (v[l][i]));
     142     1163288 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (v[l][i + 16]));
     143     1163288 :                 asm volatile ("movdqa %xmm0,%xmm2");
     144     1163288 :                 asm volatile ("movdqa %xmm1,%xmm3");
     145     9306632 :                 for (d = l - 1; d >= 0; --d) {
     146     8143344 :                         asm volatile ("pxor %xmm4,%xmm4");
     147     8143344 :                         asm volatile ("pxor %xmm5,%xmm5");
     148     8143344 :                         asm volatile ("pcmpgtb %xmm2,%xmm4");
     149     8143344 :                         asm volatile ("pcmpgtb %xmm3,%xmm5");
     150     8143344 :                         asm volatile ("paddb %xmm2,%xmm2");
     151     8143344 :                         asm volatile ("paddb %xmm3,%xmm3");
     152     8143344 :                         asm volatile ("pand %xmm7,%xmm4");
     153     8143344 :                         asm volatile ("pand %xmm7,%xmm5");
     154     8143344 :                         asm volatile ("pxor %xmm4,%xmm2");
     155     8143344 :                         asm volatile ("pxor %xmm5,%xmm3");
     156             : 
     157     8143344 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
     158     8143344 :                         asm volatile ("movdqa %0,%%xmm5" : : "m" (v[d][i + 16]));
     159     8143344 :                         asm volatile ("pxor %xmm4,%xmm0");
     160     8143344 :                         asm volatile ("pxor %xmm5,%xmm1");
     161     8143344 :                         asm volatile ("pxor %xmm4,%xmm2");
     162     8143344 :                         asm volatile ("pxor %xmm5,%xmm3");
     163             :                 }
     164     1163288 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     165     1163288 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (p[i + 16]));
     166     1163288 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (q[i]));
     167     1163288 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (q[i + 16]));
     168             :         }
     169             : 
     170             :         raid_sse_end();
     171         145 : }
     172             : #endif
     173             : 
     174             : #if defined(CONFIG_X86) && defined(CONFIG_AVX2)
     175             : /*
     176             :  * GEN2 (RAID6 with powers of 2) AVX2 implementation
     177             :  */
     178         511 : void raid_gen2_avx2(int nd, size_t size, void **vv)
     179             : {
     180         511 :         uint8_t **v = (uint8_t **)vv;
     181             :         uint8_t *p;
     182             :         uint8_t *q;
     183             :         int d, l;
     184             :         size_t i;
     185             : 
     186         511 :         l = nd - 1;
     187         511 :         p = v[nd];
     188         511 :         q = v[nd + 1];
     189             : 
     190             :         raid_avx_begin();
     191             : 
     192         511 :         asm volatile ("vbroadcasti128 %0, %%ymm7" : : "m" (gfconst16.poly[0]));
     193         511 :         asm volatile ("vpxor %ymm6,%ymm6,%ymm6");
     194             : 
     195      117851 :         for (i = 0; i < size; i += 64) {
     196      117340 :                 asm volatile ("vmovdqa %0,%%ymm0" : : "m" (v[l][i]));
     197      117340 :                 asm volatile ("vmovdqa %0,%%ymm1" : : "m" (v[l][i + 32]));
     198      117340 :                 asm volatile ("vmovdqa %ymm0,%ymm2");
     199      117340 :                 asm volatile ("vmovdqa %ymm1,%ymm3");
     200      952516 :                 for (d = l - 1; d >= 0; --d) {
     201      835176 :                         asm volatile ("vpcmpgtb %ymm2,%ymm6,%ymm4");
     202      835176 :                         asm volatile ("vpcmpgtb %ymm3,%ymm6,%ymm5");
     203      835176 :                         asm volatile ("vpaddb %ymm2,%ymm2,%ymm2");
     204      835176 :                         asm volatile ("vpaddb %ymm3,%ymm3,%ymm3");
     205      835176 :                         asm volatile ("vpand %ymm7,%ymm4,%ymm4");
     206      835176 :                         asm volatile ("vpand %ymm7,%ymm5,%ymm5");
     207      835176 :                         asm volatile ("vpxor %ymm4,%ymm2,%ymm2");
     208      835176 :                         asm volatile ("vpxor %ymm5,%ymm3,%ymm3");
     209             : 
     210      835176 :                         asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[d][i]));
     211      835176 :                         asm volatile ("vmovdqa %0,%%ymm5" : : "m" (v[d][i + 32]));
     212      835176 :                         asm volatile ("vpxor %ymm4,%ymm0,%ymm0");
     213      835176 :                         asm volatile ("vpxor %ymm5,%ymm1,%ymm1");
     214      835176 :                         asm volatile ("vpxor %ymm4,%ymm2,%ymm2");
     215      835176 :                         asm volatile ("vpxor %ymm5,%ymm3,%ymm3");
     216             :                 }
     217      117340 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
     218      117340 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (p[i + 32]));
     219      117340 :                 asm volatile ("vmovntdq %%ymm2,%0" : "=m" (q[i]));
     220      117340 :                 asm volatile ("vmovntdq %%ymm3,%0" : "=m" (q[i + 32]));
     221             :         }
     222             : 
     223             :         raid_avx_end();
     224         511 : }
     225             : #endif
     226             : 
     227             : #if defined(CONFIG_X86_64) && defined(CONFIG_SSE2)
     228             : /*
     229             :  * GEN2 (RAID6 with powers of 2) SSE2 implementation
     230             :  *
     231             :  * Note that it uses 16 registers, meaning that x64 is required.
     232             :  */
     233      269129 : void raid_gen2_sse2ext(int nd, size_t size, void **vv)
     234             : {
     235      269129 :         uint8_t **v = (uint8_t **)vv;
     236             :         uint8_t *p;
     237             :         uint8_t *q;
     238             :         int d, l;
     239             :         size_t i;
     240             : 
     241      269129 :         l = nd - 1;
     242      269129 :         p = v[nd];
     243      269129 :         q = v[nd + 1];
     244             : 
     245             :         raid_sse_begin();
     246             : 
     247      269129 :         asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.poly[0]));
     248             : 
     249     5513557 :         for (i = 0; i < size; i += 64) {
     250     5244428 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (v[l][i]));
     251     5244428 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (v[l][i + 16]));
     252     5244428 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (v[l][i + 32]));
     253     5244428 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (v[l][i + 48]));
     254     5244428 :                 asm volatile ("movdqa %xmm0,%xmm4");
     255     5244428 :                 asm volatile ("movdqa %xmm1,%xmm5");
     256     5244428 :                 asm volatile ("movdqa %xmm2,%xmm6");
     257     5244428 :                 asm volatile ("movdqa %xmm3,%xmm7");
     258    33350916 :                 for (d = l - 1; d >= 0; --d) {
     259    28106488 :                         asm volatile ("pxor %xmm8,%xmm8");
     260    28106488 :                         asm volatile ("pxor %xmm9,%xmm9");
     261    28106488 :                         asm volatile ("pxor %xmm10,%xmm10");
     262    28106488 :                         asm volatile ("pxor %xmm11,%xmm11");
     263    28106488 :                         asm volatile ("pcmpgtb %xmm4,%xmm8");
     264    28106488 :                         asm volatile ("pcmpgtb %xmm5,%xmm9");
     265    28106488 :                         asm volatile ("pcmpgtb %xmm6,%xmm10");
     266    28106488 :                         asm volatile ("pcmpgtb %xmm7,%xmm11");
     267    28106488 :                         asm volatile ("paddb %xmm4,%xmm4");
     268    28106488 :                         asm volatile ("paddb %xmm5,%xmm5");
     269    28106488 :                         asm volatile ("paddb %xmm6,%xmm6");
     270    28106488 :                         asm volatile ("paddb %xmm7,%xmm7");
     271    28106488 :                         asm volatile ("pand %xmm15,%xmm8");
     272    28106488 :                         asm volatile ("pand %xmm15,%xmm9");
     273    28106488 :                         asm volatile ("pand %xmm15,%xmm10");
     274    28106488 :                         asm volatile ("pand %xmm15,%xmm11");
     275    28106488 :                         asm volatile ("pxor %xmm8,%xmm4");
     276    28106488 :                         asm volatile ("pxor %xmm9,%xmm5");
     277    28106488 :                         asm volatile ("pxor %xmm10,%xmm6");
     278    28106488 :                         asm volatile ("pxor %xmm11,%xmm7");
     279             : 
     280    28106488 :                         asm volatile ("movdqa %0,%%xmm8" : : "m" (v[d][i]));
     281    28106488 :                         asm volatile ("movdqa %0,%%xmm9" : : "m" (v[d][i + 16]));
     282    28106488 :                         asm volatile ("movdqa %0,%%xmm10" : : "m" (v[d][i + 32]));
     283    28106488 :                         asm volatile ("movdqa %0,%%xmm11" : : "m" (v[d][i + 48]));
     284    28106488 :                         asm volatile ("pxor %xmm8,%xmm0");
     285    28106488 :                         asm volatile ("pxor %xmm9,%xmm1");
     286    28106488 :                         asm volatile ("pxor %xmm10,%xmm2");
     287    28106488 :                         asm volatile ("pxor %xmm11,%xmm3");
     288    28106488 :                         asm volatile ("pxor %xmm8,%xmm4");
     289    28106488 :                         asm volatile ("pxor %xmm9,%xmm5");
     290    28106488 :                         asm volatile ("pxor %xmm10,%xmm6");
     291    28106488 :                         asm volatile ("pxor %xmm11,%xmm7");
     292             :                 }
     293     5244428 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     294     5244428 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (p[i + 16]));
     295     5244428 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (p[i + 32]));
     296     5244428 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (p[i + 48]));
     297     5244428 :                 asm volatile ("movntdq %%xmm4,%0" : "=m" (q[i]));
     298     5244428 :                 asm volatile ("movntdq %%xmm5,%0" : "=m" (q[i + 16]));
     299     5244428 :                 asm volatile ("movntdq %%xmm6,%0" : "=m" (q[i + 32]));
     300     5244428 :                 asm volatile ("movntdq %%xmm7,%0" : "=m" (q[i + 48]));
     301             :         }
     302             : 
     303             :         raid_sse_end();
     304      269129 : }
     305             : #endif
     306             : 
     307             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
     308             : /*
     309             :  * GEN3 (triple parity with Cauchy matrix) SSSE3 implementation
     310             :  */
     311          45 : void raid_gen3_ssse3(int nd, size_t size, void **vv)
     312             : {
     313          45 :         uint8_t **v = (uint8_t **)vv;
     314             :         uint8_t *p;
     315             :         uint8_t *q;
     316             :         uint8_t *r;
     317             :         int d, l;
     318             :         size_t i;
     319             : 
     320          45 :         l = nd - 1;
     321          45 :         p = v[nd];
     322          45 :         q = v[nd + 1];
     323          45 :         r = v[nd + 2];
     324             : 
     325             :         /* special case with only one data disk */
     326          45 :         if (l == 0) {
     327           4 :                 for (i = 0; i < 3; ++i)
     328           3 :                         memcpy(v[1 + i], v[0], size);
     329           1 :                 return;
     330             :         }
     331             : 
     332             :         raid_sse_begin();
     333             : 
     334             :         /* generic case with at least two data disks */
     335          44 :         asm volatile ("movdqa %0,%%xmm3" : : "m" (gfconst16.poly[0]));
     336          44 :         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
     337             : 
     338      704572 :         for (i = 0; i < size; i += 16) {
     339             :                 /* last disk without the by two multiplication */
     340      704528 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
     341             : 
     342      704528 :                 asm volatile ("movdqa %xmm4,%xmm0");
     343      704528 :                 asm volatile ("movdqa %xmm4,%xmm1");
     344             : 
     345      704528 :                 asm volatile ("movdqa %xmm4,%xmm5");
     346      704528 :                 asm volatile ("psrlw  $4,%xmm5");
     347      704528 :                 asm volatile ("pand   %xmm7,%xmm4");
     348      704528 :                 asm volatile ("pand   %xmm7,%xmm5");
     349             : 
     350      704528 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
     351      704528 :                 asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[l][0][1][0]));
     352      704528 :                 asm volatile ("pshufb %xmm4,%xmm2");
     353      704528 :                 asm volatile ("pshufb %xmm5,%xmm6");
     354      704528 :                 asm volatile ("pxor   %xmm6,%xmm2");
     355             : 
     356             :                 /* intermediate disks */
     357     4932080 :                 for (d = l - 1; d > 0; --d) {
     358     4227552 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
     359             : 
     360     4227552 :                         asm volatile ("pxor %xmm5,%xmm5");
     361     4227552 :                         asm volatile ("pcmpgtb %xmm1,%xmm5");
     362     4227552 :                         asm volatile ("paddb %xmm1,%xmm1");
     363     4227552 :                         asm volatile ("pand %xmm3,%xmm5");
     364     4227552 :                         asm volatile ("pxor %xmm5,%xmm1");
     365             : 
     366     4227552 :                         asm volatile ("pxor %xmm4,%xmm0");
     367     4227552 :                         asm volatile ("pxor %xmm4,%xmm1");
     368             : 
     369     4227552 :                         asm volatile ("movdqa %xmm4,%xmm5");
     370     4227552 :                         asm volatile ("psrlw  $4,%xmm5");
     371     4227552 :                         asm volatile ("pand   %xmm7,%xmm4");
     372     4227552 :                         asm volatile ("pand   %xmm7,%xmm5");
     373             : 
     374     4227552 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
     375     4227552 :                         asm volatile ("pshufb %xmm4,%xmm6");
     376     4227552 :                         asm volatile ("pxor   %xmm6,%xmm2");
     377     4227552 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][1][0]));
     378     4227552 :                         asm volatile ("pshufb %xmm5,%xmm6");
     379     4227552 :                         asm volatile ("pxor   %xmm6,%xmm2");
     380             :                 }
     381             : 
     382             :                 /* first disk with all coefficients at 1 */
     383      704528 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
     384             : 
     385      704528 :                 asm volatile ("pxor %xmm5,%xmm5");
     386      704528 :                 asm volatile ("pcmpgtb %xmm1,%xmm5");
     387      704528 :                 asm volatile ("paddb %xmm1,%xmm1");
     388      704528 :                 asm volatile ("pand %xmm3,%xmm5");
     389      704528 :                 asm volatile ("pxor %xmm5,%xmm1");
     390             : 
     391      704528 :                 asm volatile ("pxor %xmm4,%xmm0");
     392      704528 :                 asm volatile ("pxor %xmm4,%xmm1");
     393      704528 :                 asm volatile ("pxor %xmm4,%xmm2");
     394             : 
     395      704528 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     396      704528 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
     397      704528 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
     398             :         }
     399             : 
     400             :         raid_sse_end();
     401             : }
     402             : #endif
     403             : 
     404             : #if defined(CONFIG_X86_64) && defined(CONFIG_SSSE3)
     405             : /*
     406             :  * GEN3 (triple parity with Cauchy matrix) SSSE3 implementation
     407             :  *
     408             :  * Note that it uses 16 registers, meaning that x64 is required.
     409             :  */
     410       28387 : void raid_gen3_ssse3ext(int nd, size_t size, void **vv)
     411             : {
     412       28387 :         uint8_t **v = (uint8_t **)vv;
     413             :         uint8_t *p;
     414             :         uint8_t *q;
     415             :         uint8_t *r;
     416             :         int d, l;
     417             :         size_t i;
     418             : 
     419       28387 :         l = nd - 1;
     420       28387 :         p = v[nd];
     421       28387 :         q = v[nd + 1];
     422       28387 :         r = v[nd + 2];
     423             : 
     424             :         /* special case with only one data disk */
     425       28387 :         if (l == 0) {
     426           4 :                 for (i = 0; i < 3; ++i)
     427           3 :                         memcpy(v[1 + i], v[0], size);
     428           1 :                 return;
     429             :         }
     430             : 
     431             :         raid_sse_begin();
     432             : 
     433             :         /* generic case with at least two data disks */
     434       28386 :         asm volatile ("movdqa %0,%%xmm3" : : "m" (gfconst16.poly[0]));
     435       28386 :         asm volatile ("movdqa %0,%%xmm11" : : "m" (gfconst16.low4[0]));
     436             : 
     437     2013834 :         for (i = 0; i < size; i += 32) {
     438             :                 /* last disk without the by two multiplication */
     439     1985448 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
     440     1985448 :                 asm volatile ("movdqa %0,%%xmm12" : : "m" (v[l][i + 16]));
     441             : 
     442     1985448 :                 asm volatile ("movdqa %xmm4,%xmm0");
     443     1985448 :                 asm volatile ("movdqa %xmm4,%xmm1");
     444     1985448 :                 asm volatile ("movdqa %xmm12,%xmm8");
     445     1985448 :                 asm volatile ("movdqa %xmm12,%xmm9");
     446             : 
     447     1985448 :                 asm volatile ("movdqa %xmm4,%xmm5");
     448     1985448 :                 asm volatile ("movdqa %xmm12,%xmm13");
     449     1985448 :                 asm volatile ("psrlw  $4,%xmm5");
     450     1985448 :                 asm volatile ("psrlw  $4,%xmm13");
     451     1985448 :                 asm volatile ("pand   %xmm11,%xmm4");
     452     1985448 :                 asm volatile ("pand   %xmm11,%xmm12");
     453     1985448 :                 asm volatile ("pand   %xmm11,%xmm5");
     454     1985448 :                 asm volatile ("pand   %xmm11,%xmm13");
     455             : 
     456     1985448 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
     457     1985448 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][0][1][0]));
     458     1985448 :                 asm volatile ("movdqa %xmm2,%xmm10");
     459     1985448 :                 asm volatile ("movdqa %xmm7,%xmm15");
     460     1985448 :                 asm volatile ("pshufb %xmm4,%xmm2");
     461     1985448 :                 asm volatile ("pshufb %xmm12,%xmm10");
     462     1985448 :                 asm volatile ("pshufb %xmm5,%xmm7");
     463     1985448 :                 asm volatile ("pshufb %xmm13,%xmm15");
     464     1985448 :                 asm volatile ("pxor   %xmm7,%xmm2");
     465     1985448 :                 asm volatile ("pxor   %xmm15,%xmm10");
     466             : 
     467             :                 /* intermediate disks */
     468    12090136 :                 for (d = l - 1; d > 0; --d) {
     469    10104688 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
     470    10104688 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (v[d][i + 16]));
     471             : 
     472    10104688 :                         asm volatile ("pxor %xmm5,%xmm5");
     473    10104688 :                         asm volatile ("pxor %xmm13,%xmm13");
     474    10104688 :                         asm volatile ("pcmpgtb %xmm1,%xmm5");
     475    10104688 :                         asm volatile ("pcmpgtb %xmm9,%xmm13");
     476    10104688 :                         asm volatile ("paddb %xmm1,%xmm1");
     477    10104688 :                         asm volatile ("paddb %xmm9,%xmm9");
     478    10104688 :                         asm volatile ("pand %xmm3,%xmm5");
     479    10104688 :                         asm volatile ("pand %xmm3,%xmm13");
     480    10104688 :                         asm volatile ("pxor %xmm5,%xmm1");
     481    10104688 :                         asm volatile ("pxor %xmm13,%xmm9");
     482             : 
     483    10104688 :                         asm volatile ("pxor %xmm4,%xmm0");
     484    10104688 :                         asm volatile ("pxor %xmm4,%xmm1");
     485    10104688 :                         asm volatile ("pxor %xmm12,%xmm8");
     486    10104688 :                         asm volatile ("pxor %xmm12,%xmm9");
     487             : 
     488    10104688 :                         asm volatile ("movdqa %xmm4,%xmm5");
     489    10104688 :                         asm volatile ("movdqa %xmm12,%xmm13");
     490    10104688 :                         asm volatile ("psrlw  $4,%xmm5");
     491    10104688 :                         asm volatile ("psrlw  $4,%xmm13");
     492    10104688 :                         asm volatile ("pand   %xmm11,%xmm4");
     493    10104688 :                         asm volatile ("pand   %xmm11,%xmm12");
     494    10104688 :                         asm volatile ("pand   %xmm11,%xmm5");
     495    10104688 :                         asm volatile ("pand   %xmm11,%xmm13");
     496             : 
     497    10104688 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
     498    10104688 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][0][1][0]));
     499    10104688 :                         asm volatile ("movdqa %xmm6,%xmm14");
     500    10104688 :                         asm volatile ("movdqa %xmm7,%xmm15");
     501    10104688 :                         asm volatile ("pshufb %xmm4,%xmm6");
     502    10104688 :                         asm volatile ("pshufb %xmm12,%xmm14");
     503    10104688 :                         asm volatile ("pshufb %xmm5,%xmm7");
     504    10104688 :                         asm volatile ("pshufb %xmm13,%xmm15");
     505    10104688 :                         asm volatile ("pxor   %xmm6,%xmm2");
     506    10104688 :                         asm volatile ("pxor   %xmm14,%xmm10");
     507    10104688 :                         asm volatile ("pxor   %xmm7,%xmm2");
     508    10104688 :                         asm volatile ("pxor   %xmm15,%xmm10");
     509             :                 }
     510             : 
     511             :                 /* first disk with all coefficients at 1 */
     512     1985448 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
     513     1985448 :                 asm volatile ("movdqa %0,%%xmm12" : : "m" (v[0][i + 16]));
     514             : 
     515     1985448 :                 asm volatile ("pxor %xmm5,%xmm5");
     516     1985448 :                 asm volatile ("pxor %xmm13,%xmm13");
     517     1985448 :                 asm volatile ("pcmpgtb %xmm1,%xmm5");
     518     1985448 :                 asm volatile ("pcmpgtb %xmm9,%xmm13");
     519     1985448 :                 asm volatile ("paddb %xmm1,%xmm1");
     520     1985448 :                 asm volatile ("paddb %xmm9,%xmm9");
     521     1985448 :                 asm volatile ("pand %xmm3,%xmm5");
     522     1985448 :                 asm volatile ("pand %xmm3,%xmm13");
     523     1985448 :                 asm volatile ("pxor %xmm5,%xmm1");
     524     1985448 :                 asm volatile ("pxor %xmm13,%xmm9");
     525             : 
     526     1985448 :                 asm volatile ("pxor %xmm4,%xmm0");
     527     1985448 :                 asm volatile ("pxor %xmm4,%xmm1");
     528     1985448 :                 asm volatile ("pxor %xmm4,%xmm2");
     529     1985448 :                 asm volatile ("pxor %xmm12,%xmm8");
     530     1985448 :                 asm volatile ("pxor %xmm12,%xmm9");
     531     1985448 :                 asm volatile ("pxor %xmm12,%xmm10");
     532             : 
     533     1985448 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     534     1985448 :                 asm volatile ("movntdq %%xmm8,%0" : "=m" (p[i + 16]));
     535     1985448 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
     536     1985448 :                 asm volatile ("movntdq %%xmm9,%0" : "=m" (q[i + 16]));
     537     1985448 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
     538     1985448 :                 asm volatile ("movntdq %%xmm10,%0" : "=m" (r[i + 16]));
     539             :         }
     540             : 
     541             :         raid_sse_end();
     542             : }
     543             : #endif
     544             : 
     545             : #if defined(CONFIG_X86_64) && defined(CONFIG_AVX2)
     546             : /*
     547             :  * GEN3 (triple parity with Cauchy matrix) AVX2 implementation
     548             :  *
     549             :  * Note that it uses 16 registers, meaning that x64 is required.
     550             :  */
     551        1154 : void raid_gen3_avx2ext(int nd, size_t size, void **vv)
     552             : {
     553        1154 :         uint8_t **v = (uint8_t **)vv;
     554             :         uint8_t *p;
     555             :         uint8_t *q;
     556             :         uint8_t *r;
     557             :         int d, l;
     558             :         size_t i;
     559             : 
     560        1154 :         l = nd - 1;
     561        1154 :         p = v[nd];
     562        1154 :         q = v[nd + 1];
     563        1154 :         r = v[nd + 2];
     564             : 
     565             :         /* special case with only one data disk */
     566        1154 :         if (l == 0) {
     567           4 :                 for (i = 0; i < 3; ++i)
     568           3 :                         memcpy(v[1 + i], v[0], size);
     569           1 :                 return;
     570             :         }
     571             : 
     572             :         raid_avx_begin();
     573             : 
     574             :         /* generic case with at least two data disks */
     575        1153 :         asm volatile ("vbroadcasti128 %0, %%ymm3" : : "m" (gfconst16.poly[0]));
     576        1153 :         asm volatile ("vbroadcasti128 %0, %%ymm11" : : "m" (gfconst16.low4[0]));
     577             : 
     578      210965 :         for (i = 0; i < size; i += 64) {
     579             :                 /* last disk without the by two multiplication */
     580      209812 :                 asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[l][i]));
     581      209812 :                 asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[l][i + 32]));
     582             : 
     583      209812 :                 asm volatile ("vmovdqa %ymm4,%ymm0");
     584      209812 :                 asm volatile ("vmovdqa %ymm4,%ymm1");
     585      209812 :                 asm volatile ("vmovdqa %ymm12,%ymm8");
     586      209812 :                 asm volatile ("vmovdqa %ymm12,%ymm9");
     587             : 
     588      209812 :                 asm volatile ("vpsrlw  $4,%ymm4,%ymm5");
     589      209812 :                 asm volatile ("vpsrlw  $4,%ymm12,%ymm13");
     590      209812 :                 asm volatile ("vpand   %ymm11,%ymm4,%ymm4");
     591      209812 :                 asm volatile ("vpand   %ymm11,%ymm12,%ymm12");
     592      209812 :                 asm volatile ("vpand   %ymm11,%ymm5,%ymm5");
     593      209812 :                 asm volatile ("vpand   %ymm11,%ymm13,%ymm13");
     594             : 
     595      209812 :                 asm volatile ("vbroadcasti128 %0,%%ymm10" : : "m" (gfgenpshufb[l][0][0][0]));
     596      209812 :                 asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[l][0][1][0]));
     597      209812 :                 asm volatile ("vpshufb %ymm4,%ymm10,%ymm2");
     598      209812 :                 asm volatile ("vpshufb %ymm12,%ymm10,%ymm10");
     599      209812 :                 asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
     600      209812 :                 asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
     601      209812 :                 asm volatile ("vpxor   %ymm7,%ymm2,%ymm2");
     602      209812 :                 asm volatile ("vpxor   %ymm15,%ymm10,%ymm10");
     603             : 
     604             :                 /* intermediate disks */
     605     1491372 :                 for (d = l - 1; d > 0; --d) {
     606     1281560 :                         asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[d][i]));
     607     1281560 :                         asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[d][i + 32]));
     608             : 
     609     1281560 :                         asm volatile ("vpxor %ymm5,%ymm5,%ymm5");
     610     1281560 :                         asm volatile ("vpxor %ymm13,%ymm13,%ymm13");
     611     1281560 :                         asm volatile ("vpcmpgtb %ymm1,%ymm5,%ymm5");
     612     1281560 :                         asm volatile ("vpcmpgtb %ymm9,%ymm13,%ymm13");
     613     1281560 :                         asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
     614     1281560 :                         asm volatile ("vpaddb %ymm9,%ymm9,%ymm9");
     615     1281560 :                         asm volatile ("vpand %ymm3,%ymm5,%ymm5");
     616     1281560 :                         asm volatile ("vpand %ymm3,%ymm13,%ymm13");
     617     1281560 :                         asm volatile ("vpxor %ymm5,%ymm1,%ymm1");
     618     1281560 :                         asm volatile ("vpxor %ymm13,%ymm9,%ymm9");
     619             : 
     620     1281560 :                         asm volatile ("vpxor %ymm4,%ymm0,%ymm0");
     621     1281560 :                         asm volatile ("vpxor %ymm4,%ymm1,%ymm1");
     622     1281560 :                         asm volatile ("vpxor %ymm12,%ymm8,%ymm8");
     623     1281560 :                         asm volatile ("vpxor %ymm12,%ymm9,%ymm9");
     624             : 
     625     1281560 :                         asm volatile ("vpsrlw  $4,%ymm4,%ymm5");
     626     1281560 :                         asm volatile ("vpsrlw  $4,%ymm12,%ymm13");
     627     1281560 :                         asm volatile ("vpand   %ymm11,%ymm4,%ymm4");
     628     1281560 :                         asm volatile ("vpand   %ymm11,%ymm12,%ymm12");
     629     1281560 :                         asm volatile ("vpand   %ymm11,%ymm5,%ymm5");
     630     1281560 :                         asm volatile ("vpand   %ymm11,%ymm13,%ymm13");
     631             : 
     632     1281560 :                         asm volatile ("vbroadcasti128 %0,%%ymm14" : : "m" (gfgenpshufb[d][0][0][0]));
     633     1281560 :                         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[d][0][1][0]));
     634     1281560 :                         asm volatile ("vpshufb %ymm4,%ymm14,%ymm6");
     635     1281560 :                         asm volatile ("vpshufb %ymm12,%ymm14,%ymm14");
     636     1281560 :                         asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
     637     1281560 :                         asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
     638     1281560 :                         asm volatile ("vpxor   %ymm6,%ymm2,%ymm2");
     639     1281560 :                         asm volatile ("vpxor   %ymm14,%ymm10,%ymm10");
     640     1281560 :                         asm volatile ("vpxor   %ymm7,%ymm2,%ymm2");
     641     1281560 :                         asm volatile ("vpxor   %ymm15,%ymm10,%ymm10");
     642             :                 }
     643             : 
     644             :                 /* first disk with all coefficients at 1 */
     645      209812 :                 asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[0][i]));
     646      209812 :                 asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[0][i + 32]));
     647             : 
     648      209812 :                 asm volatile ("vpxor %ymm5,%ymm5,%ymm5");
     649      209812 :                 asm volatile ("vpxor %ymm13,%ymm13,%ymm13");
     650      209812 :                 asm volatile ("vpcmpgtb %ymm1,%ymm5,%ymm5");
     651      209812 :                 asm volatile ("vpcmpgtb %ymm9,%ymm13,%ymm13");
     652      209812 :                 asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
     653      209812 :                 asm volatile ("vpaddb %ymm9,%ymm9,%ymm9");
     654      209812 :                 asm volatile ("vpand %ymm3,%ymm5,%ymm5");
     655      209812 :                 asm volatile ("vpand %ymm3,%ymm13,%ymm13");
     656      209812 :                 asm volatile ("vpxor %ymm5,%ymm1,%ymm1");
     657      209812 :                 asm volatile ("vpxor %ymm13,%ymm9,%ymm9");
     658             : 
     659      209812 :                 asm volatile ("vpxor %ymm4,%ymm0,%ymm0");
     660      209812 :                 asm volatile ("vpxor %ymm4,%ymm1,%ymm1");
     661      209812 :                 asm volatile ("vpxor %ymm4,%ymm2,%ymm2");
     662      209812 :                 asm volatile ("vpxor %ymm12,%ymm8,%ymm8");
     663      209812 :                 asm volatile ("vpxor %ymm12,%ymm9,%ymm9");
     664      209812 :                 asm volatile ("vpxor %ymm12,%ymm10,%ymm10");
     665             : 
     666      209812 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
     667      209812 :                 asm volatile ("vmovntdq %%ymm8,%0" : "=m" (p[i + 32]));
     668      209812 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (q[i]));
     669      209812 :                 asm volatile ("vmovntdq %%ymm9,%0" : "=m" (q[i + 32]));
     670      209812 :                 asm volatile ("vmovntdq %%ymm2,%0" : "=m" (r[i]));
     671      209812 :                 asm volatile ("vmovntdq %%ymm10,%0" : "=m" (r[i + 32]));
     672             :         }
     673             : 
     674             :         raid_avx_end();
     675             : }
     676             : #endif
     677             : 
     678             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
     679             : /*
     680             :  * GEN4 (quad parity with Cauchy matrix) SSSE3 implementation
     681             :  */
     682          22 : void raid_gen4_ssse3(int nd, size_t size, void **vv)
     683             : {
     684          22 :         uint8_t **v = (uint8_t **)vv;
     685             :         uint8_t *p;
     686             :         uint8_t *q;
     687             :         uint8_t *r;
     688             :         uint8_t *s;
     689             :         int d, l;
     690             :         size_t i;
     691             : 
     692          22 :         l = nd - 1;
     693          22 :         p = v[nd];
     694          22 :         q = v[nd + 1];
     695          22 :         r = v[nd + 2];
     696          22 :         s = v[nd + 3];
     697             : 
     698             :         /* special case with only one data disk */
     699          22 :         if (l == 0) {
     700           5 :                 for (i = 0; i < 4; ++i)
     701           4 :                         memcpy(v[1 + i], v[0], size);
     702           1 :                 return;
     703             :         }
     704             : 
     705             :         raid_sse_begin();
     706             : 
     707             :         /* generic case with at least two data disks */
     708      327717 :         for (i = 0; i < size; i += 16) {
     709             :                 /* last disk without the by two multiplication */
     710      327696 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
     711      327696 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
     712             : 
     713      327696 :                 asm volatile ("movdqa %xmm4,%xmm0");
     714      327696 :                 asm volatile ("movdqa %xmm4,%xmm1");
     715             : 
     716      327696 :                 asm volatile ("movdqa %xmm4,%xmm5");
     717      327696 :                 asm volatile ("psrlw  $4,%xmm5");
     718      327696 :                 asm volatile ("pand   %xmm7,%xmm4");
     719      327696 :                 asm volatile ("pand   %xmm7,%xmm5");
     720             : 
     721      327696 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
     722      327696 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][0][1][0]));
     723      327696 :                 asm volatile ("pshufb %xmm4,%xmm2");
     724      327696 :                 asm volatile ("pshufb %xmm5,%xmm7");
     725      327696 :                 asm volatile ("pxor   %xmm7,%xmm2");
     726             : 
     727      327696 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][1][0][0]));
     728      327696 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][1][1][0]));
     729      327696 :                 asm volatile ("pshufb %xmm4,%xmm3");
     730      327696 :                 asm volatile ("pshufb %xmm5,%xmm7");
     731      327696 :                 asm volatile ("pxor   %xmm7,%xmm3");
     732             : 
     733             :                 /* intermediate disks */
     734     2294256 :                 for (d = l - 1; d > 0; --d) {
     735     1966560 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
     736     1966560 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
     737             : 
     738     1966560 :                         asm volatile ("pxor %xmm5,%xmm5");
     739     1966560 :                         asm volatile ("pcmpgtb %xmm1,%xmm5");
     740     1966560 :                         asm volatile ("paddb %xmm1,%xmm1");
     741     1966560 :                         asm volatile ("pand %xmm7,%xmm5");
     742     1966560 :                         asm volatile ("pxor %xmm5,%xmm1");
     743             : 
     744     1966560 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
     745             : 
     746     1966560 :                         asm volatile ("pxor %xmm4,%xmm0");
     747     1966560 :                         asm volatile ("pxor %xmm4,%xmm1");
     748             : 
     749     1966560 :                         asm volatile ("movdqa %xmm4,%xmm5");
     750     1966560 :                         asm volatile ("psrlw  $4,%xmm5");
     751     1966560 :                         asm volatile ("pand   %xmm7,%xmm4");
     752     1966560 :                         asm volatile ("pand   %xmm7,%xmm5");
     753             : 
     754     1966560 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
     755     1966560 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][0][1][0]));
     756     1966560 :                         asm volatile ("pshufb %xmm4,%xmm6");
     757     1966560 :                         asm volatile ("pshufb %xmm5,%xmm7");
     758     1966560 :                         asm volatile ("pxor   %xmm6,%xmm2");
     759     1966560 :                         asm volatile ("pxor   %xmm7,%xmm2");
     760             : 
     761     1966560 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][1][0][0]));
     762     1966560 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][1][1][0]));
     763     1966560 :                         asm volatile ("pshufb %xmm4,%xmm6");
     764     1966560 :                         asm volatile ("pshufb %xmm5,%xmm7");
     765     1966560 :                         asm volatile ("pxor   %xmm6,%xmm3");
     766     1966560 :                         asm volatile ("pxor   %xmm7,%xmm3");
     767             :                 }
     768             : 
     769             :                 /* first disk with all coefficients at 1 */
     770      327696 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
     771      327696 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
     772             : 
     773      327696 :                 asm volatile ("pxor %xmm5,%xmm5");
     774      327696 :                 asm volatile ("pcmpgtb %xmm1,%xmm5");
     775      327696 :                 asm volatile ("paddb %xmm1,%xmm1");
     776      327696 :                 asm volatile ("pand %xmm7,%xmm5");
     777      327696 :                 asm volatile ("pxor %xmm5,%xmm1");
     778             : 
     779      327696 :                 asm volatile ("pxor %xmm4,%xmm0");
     780      327696 :                 asm volatile ("pxor %xmm4,%xmm1");
     781      327696 :                 asm volatile ("pxor %xmm4,%xmm2");
     782      327696 :                 asm volatile ("pxor %xmm4,%xmm3");
     783             : 
     784      327696 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     785      327696 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
     786      327696 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
     787      327696 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (s[i]));
     788             :         }
     789             : 
     790             :         raid_sse_end();
     791             : }
     792             : #endif
     793             : 
     794             : #if defined(CONFIG_X86_64) && defined(CONFIG_SSSE3)
     795             : /*
     796             :  * GEN4 (quad parity with Cauchy matrix) SSSE3 implementation
     797             :  *
     798             :  * Note that it uses 16 registers, meaning that x64 is required.
     799             :  */
     800       28339 : void raid_gen4_ssse3ext(int nd, size_t size, void **vv)
     801             : {
     802       28339 :         uint8_t **v = (uint8_t **)vv;
     803             :         uint8_t *p;
     804             :         uint8_t *q;
     805             :         uint8_t *r;
     806             :         uint8_t *s;
     807             :         int d, l;
     808             :         size_t i;
     809             : 
     810       28339 :         l = nd - 1;
     811       28339 :         p = v[nd];
     812       28339 :         q = v[nd + 1];
     813       28339 :         r = v[nd + 2];
     814       28339 :         s = v[nd + 3];
     815             : 
     816             :         /* special case with only one data disk */
     817       28339 :         if (l == 0) {
     818           5 :                 for (i = 0; i < 4; ++i)
     819           4 :                         memcpy(v[1 + i], v[0], size);
     820           1 :                 return;
     821             :         }
     822             : 
     823             :         raid_sse_begin();
     824             : 
     825             :         /* generic case with at least two data disks */
     826     1408410 :         for (i = 0; i < size; i += 32) {
     827             :                 /* last disk without the by two multiplication */
     828     1380072 :                 asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.low4[0]));
     829     1380072 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
     830     1380072 :                 asm volatile ("movdqa %0,%%xmm12" : : "m" (v[l][i + 16]));
     831             : 
     832     1380072 :                 asm volatile ("movdqa %xmm4,%xmm0");
     833     1380072 :                 asm volatile ("movdqa %xmm4,%xmm1");
     834     1380072 :                 asm volatile ("movdqa %xmm12,%xmm8");
     835     1380072 :                 asm volatile ("movdqa %xmm12,%xmm9");
     836             : 
     837     1380072 :                 asm volatile ("movdqa %xmm4,%xmm5");
     838     1380072 :                 asm volatile ("movdqa %xmm12,%xmm13");
     839     1380072 :                 asm volatile ("psrlw  $4,%xmm5");
     840     1380072 :                 asm volatile ("psrlw  $4,%xmm13");
     841     1380072 :                 asm volatile ("pand   %xmm15,%xmm4");
     842     1380072 :                 asm volatile ("pand   %xmm15,%xmm12");
     843     1380072 :                 asm volatile ("pand   %xmm15,%xmm5");
     844     1380072 :                 asm volatile ("pand   %xmm15,%xmm13");
     845             : 
     846     1380072 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
     847     1380072 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][0][1][0]));
     848     1380072 :                 asm volatile ("movdqa %xmm2,%xmm10");
     849     1380072 :                 asm volatile ("movdqa %xmm7,%xmm15");
     850     1380072 :                 asm volatile ("pshufb %xmm4,%xmm2");
     851     1380072 :                 asm volatile ("pshufb %xmm12,%xmm10");
     852     1380072 :                 asm volatile ("pshufb %xmm5,%xmm7");
     853     1380072 :                 asm volatile ("pshufb %xmm13,%xmm15");
     854     1380072 :                 asm volatile ("pxor   %xmm7,%xmm2");
     855     1380072 :                 asm volatile ("pxor   %xmm15,%xmm10");
     856             : 
     857     1380072 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][1][0][0]));
     858     1380072 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][1][1][0]));
     859     1380072 :                 asm volatile ("movdqa %xmm3,%xmm11");
     860     1380072 :                 asm volatile ("movdqa %xmm7,%xmm15");
     861     1380072 :                 asm volatile ("pshufb %xmm4,%xmm3");
     862     1380072 :                 asm volatile ("pshufb %xmm12,%xmm11");
     863     1380072 :                 asm volatile ("pshufb %xmm5,%xmm7");
     864     1380072 :                 asm volatile ("pshufb %xmm13,%xmm15");
     865     1380072 :                 asm volatile ("pxor   %xmm7,%xmm3");
     866     1380072 :                 asm volatile ("pxor   %xmm15,%xmm11");
     867             : 
     868             :                 /* intermediate disks */
     869     7850840 :                 for (d = l - 1; d > 0; --d) {
     870     6470768 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
     871     6470768 :                         asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.low4[0]));
     872     6470768 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
     873     6470768 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (v[d][i + 16]));
     874             : 
     875     6470768 :                         asm volatile ("pxor %xmm5,%xmm5");
     876     6470768 :                         asm volatile ("pxor %xmm13,%xmm13");
     877     6470768 :                         asm volatile ("pcmpgtb %xmm1,%xmm5");
     878     6470768 :                         asm volatile ("pcmpgtb %xmm9,%xmm13");
     879     6470768 :                         asm volatile ("paddb %xmm1,%xmm1");
     880     6470768 :                         asm volatile ("paddb %xmm9,%xmm9");
     881     6470768 :                         asm volatile ("pand %xmm7,%xmm5");
     882     6470768 :                         asm volatile ("pand %xmm7,%xmm13");
     883     6470768 :                         asm volatile ("pxor %xmm5,%xmm1");
     884     6470768 :                         asm volatile ("pxor %xmm13,%xmm9");
     885             : 
     886     6470768 :                         asm volatile ("pxor %xmm4,%xmm0");
     887     6470768 :                         asm volatile ("pxor %xmm4,%xmm1");
     888     6470768 :                         asm volatile ("pxor %xmm12,%xmm8");
     889     6470768 :                         asm volatile ("pxor %xmm12,%xmm9");
     890             : 
     891     6470768 :                         asm volatile ("movdqa %xmm4,%xmm5");
     892     6470768 :                         asm volatile ("movdqa %xmm12,%xmm13");
     893     6470768 :                         asm volatile ("psrlw  $4,%xmm5");
     894     6470768 :                         asm volatile ("psrlw  $4,%xmm13");
     895     6470768 :                         asm volatile ("pand   %xmm15,%xmm4");
     896     6470768 :                         asm volatile ("pand   %xmm15,%xmm12");
     897     6470768 :                         asm volatile ("pand   %xmm15,%xmm5");
     898     6470768 :                         asm volatile ("pand   %xmm15,%xmm13");
     899             : 
     900     6470768 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
     901     6470768 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][0][1][0]));
     902     6470768 :                         asm volatile ("movdqa %xmm6,%xmm14");
     903     6470768 :                         asm volatile ("movdqa %xmm7,%xmm15");
     904     6470768 :                         asm volatile ("pshufb %xmm4,%xmm6");
     905     6470768 :                         asm volatile ("pshufb %xmm12,%xmm14");
     906     6470768 :                         asm volatile ("pshufb %xmm5,%xmm7");
     907     6470768 :                         asm volatile ("pshufb %xmm13,%xmm15");
     908     6470768 :                         asm volatile ("pxor   %xmm6,%xmm2");
     909     6470768 :                         asm volatile ("pxor   %xmm14,%xmm10");
     910     6470768 :                         asm volatile ("pxor   %xmm7,%xmm2");
     911     6470768 :                         asm volatile ("pxor   %xmm15,%xmm10");
     912             : 
     913     6470768 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][1][0][0]));
     914     6470768 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][1][1][0]));
     915     6470768 :                         asm volatile ("movdqa %xmm6,%xmm14");
     916     6470768 :                         asm volatile ("movdqa %xmm7,%xmm15");
     917     6470768 :                         asm volatile ("pshufb %xmm4,%xmm6");
     918     6470768 :                         asm volatile ("pshufb %xmm12,%xmm14");
     919     6470768 :                         asm volatile ("pshufb %xmm5,%xmm7");
     920     6470768 :                         asm volatile ("pshufb %xmm13,%xmm15");
     921     6470768 :                         asm volatile ("pxor   %xmm6,%xmm3");
     922     6470768 :                         asm volatile ("pxor   %xmm14,%xmm11");
     923     6470768 :                         asm volatile ("pxor   %xmm7,%xmm3");
     924     6470768 :                         asm volatile ("pxor   %xmm15,%xmm11");
     925             :                 }
     926             : 
     927             :                 /* first disk with all coefficients at 1 */
     928     1380072 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
     929     1380072 :                 asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.low4[0]));
     930     1380072 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
     931     1380072 :                 asm volatile ("movdqa %0,%%xmm12" : : "m" (v[0][i + 16]));
     932             : 
     933     1380072 :                 asm volatile ("pxor %xmm5,%xmm5");
     934     1380072 :                 asm volatile ("pxor %xmm13,%xmm13");
     935     1380072 :                 asm volatile ("pcmpgtb %xmm1,%xmm5");
     936     1380072 :                 asm volatile ("pcmpgtb %xmm9,%xmm13");
     937     1380072 :                 asm volatile ("paddb %xmm1,%xmm1");
     938     1380072 :                 asm volatile ("paddb %xmm9,%xmm9");
     939     1380072 :                 asm volatile ("pand %xmm7,%xmm5");
     940     1380072 :                 asm volatile ("pand %xmm7,%xmm13");
     941     1380072 :                 asm volatile ("pxor %xmm5,%xmm1");
     942     1380072 :                 asm volatile ("pxor %xmm13,%xmm9");
     943             : 
     944     1380072 :                 asm volatile ("pxor %xmm4,%xmm0");
     945     1380072 :                 asm volatile ("pxor %xmm4,%xmm1");
     946     1380072 :                 asm volatile ("pxor %xmm4,%xmm2");
     947     1380072 :                 asm volatile ("pxor %xmm4,%xmm3");
     948     1380072 :                 asm volatile ("pxor %xmm12,%xmm8");
     949     1380072 :                 asm volatile ("pxor %xmm12,%xmm9");
     950     1380072 :                 asm volatile ("pxor %xmm12,%xmm10");
     951     1380072 :                 asm volatile ("pxor %xmm12,%xmm11");
     952             : 
     953     1380072 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
     954     1380072 :                 asm volatile ("movntdq %%xmm8,%0" : "=m" (p[i + 16]));
     955     1380072 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
     956     1380072 :                 asm volatile ("movntdq %%xmm9,%0" : "=m" (q[i + 16]));
     957     1380072 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
     958     1380072 :                 asm volatile ("movntdq %%xmm10,%0" : "=m" (r[i + 16]));
     959     1380072 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (s[i]));
     960     1380072 :                 asm volatile ("movntdq %%xmm11,%0" : "=m" (s[i + 16]));
     961             :         }
     962             : 
     963             :         raid_sse_end();
     964             : }
     965             : #endif
     966             : 
     967             : #if defined(CONFIG_X86_64) && defined(CONFIG_AVX2)
     968             : /*
     969             :  * GEN4 (quad parity with Cauchy matrix) AVX2 implementation
     970             :  *
     971             :  * Note that it uses 16 registers, meaning that x64 is required.
     972             :  */
     973        4128 : void raid_gen4_avx2ext(int nd, size_t size, void **vv)
     974             : {
     975        4128 :         uint8_t **v = (uint8_t **)vv;
     976             :         uint8_t *p;
     977             :         uint8_t *q;
     978             :         uint8_t *r;
     979             :         uint8_t *s;
     980             :         int d, l;
     981             :         size_t i;
     982             : 
     983        4128 :         l = nd - 1;
     984        4128 :         p = v[nd];
     985        4128 :         q = v[nd + 1];
     986        4128 :         r = v[nd + 2];
     987        4128 :         s = v[nd + 3];
     988             : 
     989             :         /* special case with only one data disk */
     990        4128 :         if (l == 0) {
     991           5 :                 for (i = 0; i < 4; ++i)
     992           4 :                         memcpy(v[1 + i], v[0], size);
     993           1 :                 return;
     994             :         }
     995             : 
     996             :         raid_avx_begin();
     997             : 
     998             :         /* generic case with at least two data disks */
     999      123295 :         for (i = 0; i < size; i += 64) {
    1000             :                 /* last disk without the by two multiplication */
    1001      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfconst16.low4[0]));
    1002      119168 :                 asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[l][i]));
    1003      119168 :                 asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[l][i + 32]));
    1004             : 
    1005      119168 :                 asm volatile ("vmovdqa %ymm4,%ymm0");
    1006      119168 :                 asm volatile ("vmovdqa %ymm4,%ymm1");
    1007      119168 :                 asm volatile ("vmovdqa %ymm12,%ymm8");
    1008      119168 :                 asm volatile ("vmovdqa %ymm12,%ymm9");
    1009             : 
    1010      119168 :                 asm volatile ("vpsrlw  $4,%ymm4,%ymm5");
    1011      119168 :                 asm volatile ("vpsrlw  $4,%ymm12,%ymm13");
    1012      119168 :                 asm volatile ("vpand   %ymm15,%ymm4,%ymm4");
    1013      119168 :                 asm volatile ("vpand   %ymm15,%ymm12,%ymm12");
    1014      119168 :                 asm volatile ("vpand   %ymm15,%ymm5,%ymm5");
    1015      119168 :                 asm volatile ("vpand   %ymm15,%ymm13,%ymm13");
    1016             : 
    1017      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm10" : : "m" (gfgenpshufb[l][0][0][0]));
    1018      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[l][0][1][0]));
    1019      119168 :                 asm volatile ("vpshufb %ymm4,%ymm10,%ymm2");
    1020      119168 :                 asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
    1021      119168 :                 asm volatile ("vpshufb %ymm12,%ymm10,%ymm10");
    1022      119168 :                 asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
    1023      119168 :                 asm volatile ("vpxor   %ymm7,%ymm2,%ymm2");
    1024      119168 :                 asm volatile ("vpxor   %ymm15,%ymm10,%ymm10");
    1025             : 
    1026      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm11" : : "m" (gfgenpshufb[l][1][0][0]));
    1027      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[l][1][1][0]));
    1028      119168 :                 asm volatile ("vpshufb %ymm4,%ymm11,%ymm3");
    1029      119168 :                 asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
    1030      119168 :                 asm volatile ("vpshufb %ymm12,%ymm11,%ymm11");
    1031      119168 :                 asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
    1032      119168 :                 asm volatile ("vpxor   %ymm7,%ymm3,%ymm3");
    1033      119168 :                 asm volatile ("vpxor   %ymm15,%ymm11,%ymm11");
    1034             : 
    1035             :                 /* intermediate disks */
    1036      902864 :                 for (d = l - 1; d > 0; --d) {
    1037      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm7" : : "m" (gfconst16.poly[0]));
    1038      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfconst16.low4[0]));
    1039      783696 :                         asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[d][i]));
    1040      783696 :                         asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[d][i + 32]));
    1041             : 
    1042      783696 :                         asm volatile ("vpxor %ymm5,%ymm5,%ymm5");
    1043      783696 :                         asm volatile ("vpxor %ymm13,%ymm13,%ymm13");
    1044      783696 :                         asm volatile ("vpcmpgtb %ymm1,%ymm5,%ymm5");
    1045      783696 :                         asm volatile ("vpcmpgtb %ymm9,%ymm13,%ymm13");
    1046      783696 :                         asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1047      783696 :                         asm volatile ("vpaddb %ymm9,%ymm9,%ymm9");
    1048      783696 :                         asm volatile ("vpand %ymm7,%ymm5,%ymm5");
    1049      783696 :                         asm volatile ("vpand %ymm7,%ymm13,%ymm13");
    1050      783696 :                         asm volatile ("vpxor %ymm5,%ymm1,%ymm1");
    1051      783696 :                         asm volatile ("vpxor %ymm13,%ymm9,%ymm9");
    1052             : 
    1053      783696 :                         asm volatile ("vpxor %ymm4,%ymm0,%ymm0");
    1054      783696 :                         asm volatile ("vpxor %ymm4,%ymm1,%ymm1");
    1055      783696 :                         asm volatile ("vpxor %ymm12,%ymm8,%ymm8");
    1056      783696 :                         asm volatile ("vpxor %ymm12,%ymm9,%ymm9");
    1057             : 
    1058      783696 :                         asm volatile ("vpsrlw  $4,%ymm4,%ymm5");
    1059      783696 :                         asm volatile ("vpsrlw  $4,%ymm12,%ymm13");
    1060      783696 :                         asm volatile ("vpand   %ymm15,%ymm4,%ymm4");
    1061      783696 :                         asm volatile ("vpand   %ymm15,%ymm12,%ymm12");
    1062      783696 :                         asm volatile ("vpand   %ymm15,%ymm5,%ymm5");
    1063      783696 :                         asm volatile ("vpand   %ymm15,%ymm13,%ymm13");
    1064             : 
    1065      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm14" : : "m" (gfgenpshufb[d][0][0][0]));
    1066      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[d][0][1][0]));
    1067      783696 :                         asm volatile ("vpshufb %ymm4,%ymm14,%ymm6");
    1068      783696 :                         asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
    1069      783696 :                         asm volatile ("vpshufb %ymm12,%ymm14,%ymm14");
    1070      783696 :                         asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
    1071      783696 :                         asm volatile ("vpxor   %ymm6,%ymm2,%ymm2");
    1072      783696 :                         asm volatile ("vpxor   %ymm14,%ymm10,%ymm10");
    1073      783696 :                         asm volatile ("vpxor   %ymm7,%ymm2,%ymm2");
    1074      783696 :                         asm volatile ("vpxor   %ymm15,%ymm10,%ymm10");
    1075             : 
    1076      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm14" : : "m" (gfgenpshufb[d][1][0][0]));
    1077      783696 :                         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfgenpshufb[d][1][1][0]));
    1078      783696 :                         asm volatile ("vpshufb %ymm4,%ymm14,%ymm6");
    1079      783696 :                         asm volatile ("vpshufb %ymm5,%ymm15,%ymm7");
    1080      783696 :                         asm volatile ("vpshufb %ymm12,%ymm14,%ymm14");
    1081      783696 :                         asm volatile ("vpshufb %ymm13,%ymm15,%ymm15");
    1082      783696 :                         asm volatile ("vpxor   %ymm6,%ymm3,%ymm3");
    1083      783696 :                         asm volatile ("vpxor   %ymm14,%ymm11,%ymm11");
    1084      783696 :                         asm volatile ("vpxor   %ymm7,%ymm3,%ymm3");
    1085      783696 :                         asm volatile ("vpxor   %ymm15,%ymm11,%ymm11");
    1086             :                 }
    1087             : 
    1088             :                 /* first disk with all coefficients at 1 */
    1089      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm7" : : "m" (gfconst16.poly[0]));
    1090      119168 :                 asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfconst16.low4[0]));
    1091      119168 :                 asm volatile ("vmovdqa %0,%%ymm4" : : "m" (v[0][i]));
    1092      119168 :                 asm volatile ("vmovdqa %0,%%ymm12" : : "m" (v[0][i + 32]));
    1093             : 
    1094      119168 :                 asm volatile ("vpxor %ymm5,%ymm5,%ymm5");
    1095      119168 :                 asm volatile ("vpxor %ymm13,%ymm13,%ymm13");
    1096      119168 :                 asm volatile ("vpcmpgtb %ymm1,%ymm5,%ymm5");
    1097      119168 :                 asm volatile ("vpcmpgtb %ymm9,%ymm13,%ymm13");
    1098      119168 :                 asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1099      119168 :                 asm volatile ("vpaddb %ymm9,%ymm9,%ymm9");
    1100      119168 :                 asm volatile ("vpand %ymm7,%ymm5,%ymm5");
    1101      119168 :                 asm volatile ("vpand %ymm7,%ymm13,%ymm13");
    1102      119168 :                 asm volatile ("vpxor %ymm5,%ymm1,%ymm1");
    1103      119168 :                 asm volatile ("vpxor %ymm13,%ymm9,%ymm9");
    1104             : 
    1105      119168 :                 asm volatile ("vpxor %ymm4,%ymm0,%ymm0");
    1106      119168 :                 asm volatile ("vpxor %ymm4,%ymm1,%ymm1");
    1107      119168 :                 asm volatile ("vpxor %ymm4,%ymm2,%ymm2");
    1108      119168 :                 asm volatile ("vpxor %ymm4,%ymm3,%ymm3");
    1109      119168 :                 asm volatile ("vpxor %ymm12,%ymm8,%ymm8");
    1110      119168 :                 asm volatile ("vpxor %ymm12,%ymm9,%ymm9");
    1111      119168 :                 asm volatile ("vpxor %ymm12,%ymm10,%ymm10");
    1112      119168 :                 asm volatile ("vpxor %ymm12,%ymm11,%ymm11");
    1113             : 
    1114      119168 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
    1115      119168 :                 asm volatile ("vmovntdq %%ymm8,%0" : "=m" (p[i + 32]));
    1116      119168 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (q[i]));
    1117      119168 :                 asm volatile ("vmovntdq %%ymm9,%0" : "=m" (q[i + 32]));
    1118      119168 :                 asm volatile ("vmovntdq %%ymm2,%0" : "=m" (r[i]));
    1119      119168 :                 asm volatile ("vmovntdq %%ymm10,%0" : "=m" (r[i + 32]));
    1120      119168 :                 asm volatile ("vmovntdq %%ymm3,%0" : "=m" (s[i]));
    1121      119168 :                 asm volatile ("vmovntdq %%ymm11,%0" : "=m" (s[i + 32]));
    1122             :         }
    1123             : 
    1124             :         raid_avx_end();
    1125             : }
    1126             : #endif
    1127             : 
    1128             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
    1129             : /*
    1130             :  * GEN5 (penta parity with Cauchy matrix) SSSE3 implementation
    1131             :  */
    1132          14 : void raid_gen5_ssse3(int nd, size_t size, void **vv)
    1133             : {
    1134          14 :         uint8_t **v = (uint8_t **)vv;
    1135             :         uint8_t *p;
    1136             :         uint8_t *q;
    1137             :         uint8_t *r;
    1138             :         uint8_t *s;
    1139             :         uint8_t *t;
    1140             :         int d, l;
    1141             :         size_t i;
    1142             :         uint8_t buffer[16+16];
    1143          14 :         uint8_t *pd = __align_ptr(buffer, 16);
    1144             : 
    1145          14 :         l = nd - 1;
    1146          14 :         p = v[nd];
    1147          14 :         q = v[nd + 1];
    1148          14 :         r = v[nd + 2];
    1149          14 :         s = v[nd + 3];
    1150          14 :         t = v[nd + 4];
    1151             : 
    1152             :         /* special case with only one data disk */
    1153          14 :         if (l == 0) {
    1154           6 :                 for (i = 0; i < 5; ++i)
    1155           5 :                         memcpy(v[1 + i], v[0], size);
    1156           1 :                 return;
    1157             :         }
    1158             : 
    1159             :         raid_sse_begin();
    1160             : 
    1161             :         /* generic case with at least two data disks */
    1162      196637 :         for (i = 0; i < size; i += 16) {
    1163             :                 /* last disk without the by two multiplication */
    1164      196624 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
    1165             : 
    1166      196624 :                 asm volatile ("movdqa %xmm4,%xmm0");
    1167      196624 :                 asm volatile ("movdqa %%xmm4,%0" : "=m" (pd[0]));
    1168             : 
    1169      196624 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    1170      196624 :                 asm volatile ("movdqa %xmm4,%xmm5");
    1171      196624 :                 asm volatile ("psrlw  $4,%xmm5");
    1172      196624 :                 asm volatile ("pand   %xmm7,%xmm4");
    1173      196624 :                 asm volatile ("pand   %xmm7,%xmm5");
    1174             : 
    1175      196624 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (gfgenpshufb[l][0][0][0]));
    1176      196624 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][0][1][0]));
    1177      196624 :                 asm volatile ("pshufb %xmm4,%xmm1");
    1178      196624 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1179      196624 :                 asm volatile ("pxor   %xmm7,%xmm1");
    1180             : 
    1181      196624 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][1][0][0]));
    1182      196624 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][1][1][0]));
    1183      196624 :                 asm volatile ("pshufb %xmm4,%xmm2");
    1184      196624 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1185      196624 :                 asm volatile ("pxor   %xmm7,%xmm2");
    1186             : 
    1187      196624 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][2][0][0]));
    1188      196624 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][2][1][0]));
    1189      196624 :                 asm volatile ("pshufb %xmm4,%xmm3");
    1190      196624 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1191      196624 :                 asm volatile ("pxor   %xmm7,%xmm3");
    1192             : 
    1193             :                 /* intermediate disks */
    1194     1376752 :                 for (d = l - 1; d > 0; --d) {
    1195     1180128 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
    1196     1180128 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (pd[0]));
    1197     1180128 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
    1198             : 
    1199     1180128 :                         asm volatile ("pxor %xmm5,%xmm5");
    1200     1180128 :                         asm volatile ("pcmpgtb %xmm0,%xmm5");
    1201     1180128 :                         asm volatile ("paddb %xmm0,%xmm0");
    1202     1180128 :                         asm volatile ("pand %xmm7,%xmm5");
    1203     1180128 :                         asm volatile ("pxor %xmm5,%xmm0");
    1204             : 
    1205     1180128 :                         asm volatile ("pxor %xmm4,%xmm0");
    1206     1180128 :                         asm volatile ("pxor %xmm4,%xmm6");
    1207     1180128 :                         asm volatile ("movdqa %%xmm6,%0" : "=m" (pd[0]));
    1208             : 
    1209     1180128 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    1210     1180128 :                         asm volatile ("movdqa %xmm4,%xmm5");
    1211     1180128 :                         asm volatile ("psrlw  $4,%xmm5");
    1212     1180128 :                         asm volatile ("pand   %xmm7,%xmm4");
    1213     1180128 :                         asm volatile ("pand   %xmm7,%xmm5");
    1214             : 
    1215     1180128 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
    1216     1180128 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][0][1][0]));
    1217     1180128 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1218     1180128 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1219     1180128 :                         asm volatile ("pxor   %xmm6,%xmm1");
    1220     1180128 :                         asm volatile ("pxor   %xmm7,%xmm1");
    1221             : 
    1222     1180128 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][1][0][0]));
    1223     1180128 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][1][1][0]));
    1224     1180128 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1225     1180128 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1226     1180128 :                         asm volatile ("pxor   %xmm6,%xmm2");
    1227     1180128 :                         asm volatile ("pxor   %xmm7,%xmm2");
    1228             : 
    1229     1180128 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][2][0][0]));
    1230     1180128 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][2][1][0]));
    1231     1180128 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1232     1180128 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1233     1180128 :                         asm volatile ("pxor   %xmm6,%xmm3");
    1234     1180128 :                         asm volatile ("pxor   %xmm7,%xmm3");
    1235             :                 }
    1236             : 
    1237             :                 /* first disk with all coefficients at 1 */
    1238      196624 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
    1239      196624 :                 asm volatile ("movdqa %0,%%xmm6" : : "m" (pd[0]));
    1240      196624 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
    1241             : 
    1242      196624 :                 asm volatile ("pxor %xmm5,%xmm5");
    1243      196624 :                 asm volatile ("pcmpgtb %xmm0,%xmm5");
    1244      196624 :                 asm volatile ("paddb %xmm0,%xmm0");
    1245      196624 :                 asm volatile ("pand %xmm7,%xmm5");
    1246      196624 :                 asm volatile ("pxor %xmm5,%xmm0");
    1247             : 
    1248      196624 :                 asm volatile ("pxor %xmm4,%xmm0");
    1249      196624 :                 asm volatile ("pxor %xmm4,%xmm1");
    1250      196624 :                 asm volatile ("pxor %xmm4,%xmm2");
    1251      196624 :                 asm volatile ("pxor %xmm4,%xmm3");
    1252      196624 :                 asm volatile ("pxor %xmm4,%xmm6");
    1253             : 
    1254      196624 :                 asm volatile ("movntdq %%xmm6,%0" : "=m" (p[i]));
    1255      196624 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (q[i]));
    1256      196624 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (r[i]));
    1257      196624 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (s[i]));
    1258      196624 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (t[i]));
    1259             :         }
    1260             : 
    1261             :         raid_sse_end();
    1262             : }
    1263             : #endif
    1264             : 
    1265             : #if defined(CONFIG_X86_64) && defined(CONFIG_SSSE3)
    1266             : /*
    1267             :  * GEN5 (penta parity with Cauchy matrix) SSSE3 implementation
    1268             :  *
    1269             :  * Note that it uses 16 registers, meaning that x64 is required.
    1270             :  */
    1271       37518 : void raid_gen5_ssse3ext(int nd, size_t size, void **vv)
    1272             : {
    1273       37518 :         uint8_t **v = (uint8_t **)vv;
    1274             :         uint8_t *p;
    1275             :         uint8_t *q;
    1276             :         uint8_t *r;
    1277             :         uint8_t *s;
    1278             :         uint8_t *t;
    1279             :         int d, l;
    1280             :         size_t i;
    1281             : 
    1282       37518 :         l = nd - 1;
    1283       37518 :         p = v[nd];
    1284       37518 :         q = v[nd + 1];
    1285       37518 :         r = v[nd + 2];
    1286       37518 :         s = v[nd + 3];
    1287       37518 :         t = v[nd + 4];
    1288             : 
    1289             :         /* special case with only one data disk */
    1290       37518 :         if (l == 0) {
    1291           6 :                 for (i = 0; i < 5; ++i)
    1292           5 :                         memcpy(v[1 + i], v[0], size);
    1293           1 :                 return;
    1294             :         }
    1295             : 
    1296             :         raid_sse_begin();
    1297             : 
    1298             :         /* generic case with at least two data disks */
    1299       37517 :         asm volatile ("movdqa %0,%%xmm14" : : "m" (gfconst16.poly[0]));
    1300       37517 :         asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.low4[0]));
    1301             : 
    1302     3287197 :         for (i = 0; i < size; i += 16) {
    1303             :                 /* last disk without the by two multiplication */
    1304     3249680 :                 asm volatile ("movdqa %0,%%xmm10" : : "m" (v[l][i]));
    1305             : 
    1306     3249680 :                 asm volatile ("movdqa %xmm10,%xmm0");
    1307     3249680 :                 asm volatile ("movdqa %xmm10,%xmm1");
    1308             : 
    1309     3249680 :                 asm volatile ("movdqa %xmm10,%xmm11");
    1310     3249680 :                 asm volatile ("psrlw  $4,%xmm11");
    1311     3249680 :                 asm volatile ("pand   %xmm15,%xmm10");
    1312     3249680 :                 asm volatile ("pand   %xmm15,%xmm11");
    1313             : 
    1314     3249680 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
    1315     3249680 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][0][1][0]));
    1316     3249680 :                 asm volatile ("pshufb %xmm10,%xmm2");
    1317     3249680 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1318     3249680 :                 asm volatile ("pxor   %xmm13,%xmm2");
    1319             : 
    1320     3249680 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][1][0][0]));
    1321     3249680 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][1][1][0]));
    1322     3249680 :                 asm volatile ("pshufb %xmm10,%xmm3");
    1323     3249680 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1324     3249680 :                 asm volatile ("pxor   %xmm13,%xmm3");
    1325             : 
    1326     3249680 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (gfgenpshufb[l][2][0][0]));
    1327     3249680 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][2][1][0]));
    1328     3249680 :                 asm volatile ("pshufb %xmm10,%xmm4");
    1329     3249680 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1330     3249680 :                 asm volatile ("pxor   %xmm13,%xmm4");
    1331             : 
    1332             :                 /* intermediate disks */
    1333    17952752 :                 for (d = l - 1; d > 0; --d) {
    1334    14703072 :                         asm volatile ("movdqa %0,%%xmm10" : : "m" (v[d][i]));
    1335             : 
    1336    14703072 :                         asm volatile ("pxor %xmm11,%xmm11");
    1337    14703072 :                         asm volatile ("pcmpgtb %xmm1,%xmm11");
    1338    14703072 :                         asm volatile ("paddb %xmm1,%xmm1");
    1339    14703072 :                         asm volatile ("pand %xmm14,%xmm11");
    1340    14703072 :                         asm volatile ("pxor %xmm11,%xmm1");
    1341             : 
    1342    14703072 :                         asm volatile ("pxor %xmm10,%xmm0");
    1343    14703072 :                         asm volatile ("pxor %xmm10,%xmm1");
    1344             : 
    1345    14703072 :                         asm volatile ("movdqa %xmm10,%xmm11");
    1346    14703072 :                         asm volatile ("psrlw  $4,%xmm11");
    1347    14703072 :                         asm volatile ("pand   %xmm15,%xmm10");
    1348    14703072 :                         asm volatile ("pand   %xmm15,%xmm11");
    1349             : 
    1350    14703072 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][0][0][0]));
    1351    14703072 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][0][1][0]));
    1352    14703072 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1353    14703072 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1354    14703072 :                         asm volatile ("pxor   %xmm12,%xmm2");
    1355    14703072 :                         asm volatile ("pxor   %xmm13,%xmm2");
    1356             : 
    1357    14703072 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][1][0][0]));
    1358    14703072 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][1][1][0]));
    1359    14703072 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1360    14703072 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1361    14703072 :                         asm volatile ("pxor   %xmm12,%xmm3");
    1362    14703072 :                         asm volatile ("pxor   %xmm13,%xmm3");
    1363             : 
    1364    14703072 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][2][0][0]));
    1365    14703072 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][2][1][0]));
    1366    14703072 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1367    14703072 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1368    14703072 :                         asm volatile ("pxor   %xmm12,%xmm4");
    1369    14703072 :                         asm volatile ("pxor   %xmm13,%xmm4");
    1370             :                 }
    1371             : 
    1372             :                 /* first disk with all coefficients at 1 */
    1373     3249680 :                 asm volatile ("movdqa %0,%%xmm10" : : "m" (v[0][i]));
    1374             : 
    1375     3249680 :                 asm volatile ("pxor %xmm11,%xmm11");
    1376     3249680 :                 asm volatile ("pcmpgtb %xmm1,%xmm11");
    1377     3249680 :                 asm volatile ("paddb %xmm1,%xmm1");
    1378     3249680 :                 asm volatile ("pand %xmm14,%xmm11");
    1379     3249680 :                 asm volatile ("pxor %xmm11,%xmm1");
    1380             : 
    1381     3249680 :                 asm volatile ("pxor %xmm10,%xmm0");
    1382     3249680 :                 asm volatile ("pxor %xmm10,%xmm1");
    1383     3249680 :                 asm volatile ("pxor %xmm10,%xmm2");
    1384     3249680 :                 asm volatile ("pxor %xmm10,%xmm3");
    1385     3249680 :                 asm volatile ("pxor %xmm10,%xmm4");
    1386             : 
    1387     3249680 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
    1388     3249680 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
    1389     3249680 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
    1390     3249680 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (s[i]));
    1391     3249680 :                 asm volatile ("movntdq %%xmm4,%0" : "=m" (t[i]));
    1392             :         }
    1393             : 
    1394             :         raid_sse_end();
    1395             : }
    1396             : #endif
    1397             : 
    1398             : #if defined(CONFIG_X86_64) && defined(CONFIG_AVX2)
    1399             : /*
    1400             :  * GEN5 (penta parity with Cauchy matrix) AVX2 implementation
    1401             :  *
    1402             :  * Note that it uses 16 registers, meaning that x64 is required.
    1403             :  */
    1404       13137 : void raid_gen5_avx2ext(int nd, size_t size, void **vv)
    1405             : {
    1406       13137 :         uint8_t **v = (uint8_t **)vv;
    1407             :         uint8_t *p;
    1408             :         uint8_t *q;
    1409             :         uint8_t *r;
    1410             :         uint8_t *s;
    1411             :         uint8_t *t;
    1412             :         int d, l;
    1413             :         size_t i;
    1414             : 
    1415       13137 :         l = nd - 1;
    1416       13137 :         p = v[nd];
    1417       13137 :         q = v[nd + 1];
    1418       13137 :         r = v[nd + 2];
    1419       13137 :         s = v[nd + 3];
    1420       13137 :         t = v[nd + 4];
    1421             : 
    1422             :         /* special case with only one data disk */
    1423       13137 :         if (l == 0) {
    1424           6 :                 for (i = 0; i < 5; ++i)
    1425           5 :                         memcpy(v[1 + i], v[0], size);
    1426           1 :                 return;
    1427             :         }
    1428             : 
    1429             :         raid_avx_begin();
    1430             : 
    1431             :         /* generic case with at least two data disks */
    1432       13136 :         asm volatile ("vpxor %ymm8,%ymm8,%ymm8");
    1433       13136 :         asm volatile ("vbroadcasti128 %0,%%ymm14" : : "m" (gfconst16.poly[0]));
    1434       13136 :         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfconst16.low4[0]));
    1435             : 
    1436      323544 :         for (i = 0; i < size; i += 32) {
    1437             :                 /* last disk without the by two multiplication */
    1438      310408 :                 asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[l][i]));
    1439             : 
    1440      310408 :                 asm volatile ("vmovdqa %ymm10,%ymm0");
    1441      310408 :                 asm volatile ("vmovdqa %ymm10,%ymm1");
    1442             : 
    1443      310408 :                 asm volatile ("vpsrlw  $4,%ymm10,%ymm11");
    1444      310408 :                 asm volatile ("vpand   %ymm15,%ymm10,%ymm10");
    1445      310408 :                 asm volatile ("vpand   %ymm15,%ymm11,%ymm11");
    1446             : 
    1447      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfgenpshufb[l][0][0][0]));
    1448      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][0][1][0]));
    1449      310408 :                 asm volatile ("vpshufb %ymm10,%ymm2,%ymm2");
    1450      310408 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1451      310408 :                 asm volatile ("vpxor   %ymm13,%ymm2,%ymm2");
    1452             : 
    1453      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfgenpshufb[l][1][0][0]));
    1454      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][1][1][0]));
    1455      310408 :                 asm volatile ("vpshufb %ymm10,%ymm3,%ymm3");
    1456      310408 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1457      310408 :                 asm volatile ("vpxor   %ymm13,%ymm3,%ymm3");
    1458             : 
    1459      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm4" : : "m" (gfgenpshufb[l][2][0][0]));
    1460      310408 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][2][1][0]));
    1461      310408 :                 asm volatile ("vpshufb %ymm10,%ymm4,%ymm4");
    1462      310408 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1463      310408 :                 asm volatile ("vpxor   %ymm13,%ymm4,%ymm4");
    1464             : 
    1465             :                 /* intermediate disks */
    1466     2598520 :                 for (d = l - 1; d > 0; --d) {
    1467     2288112 :                         asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[d][i]));
    1468             : 
    1469     2288112 :                         asm volatile ("vpcmpgtb %ymm1,%ymm8,%ymm11");
    1470     2288112 :                         asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1471     2288112 :                         asm volatile ("vpand %ymm14,%ymm11,%ymm11");
    1472     2288112 :                         asm volatile ("vpxor %ymm11,%ymm1,%ymm1");
    1473             : 
    1474     2288112 :                         asm volatile ("vpxor %ymm10,%ymm0,%ymm0");
    1475     2288112 :                         asm volatile ("vpxor %ymm10,%ymm1,%ymm1");
    1476             : 
    1477     2288112 :                         asm volatile ("vpsrlw  $4,%ymm10,%ymm11");
    1478     2288112 :                         asm volatile ("vpand   %ymm15,%ymm10,%ymm10");
    1479     2288112 :                         asm volatile ("vpand   %ymm15,%ymm11,%ymm11");
    1480             : 
    1481     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][0][0][0]));
    1482     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][0][1][0]));
    1483     2288112 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1484     2288112 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1485     2288112 :                         asm volatile ("vpxor   %ymm12,%ymm2,%ymm2");
    1486     2288112 :                         asm volatile ("vpxor   %ymm13,%ymm2,%ymm2");
    1487             : 
    1488     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][1][0][0]));
    1489     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][1][1][0]));
    1490     2288112 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1491     2288112 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1492     2288112 :                         asm volatile ("vpxor   %ymm12,%ymm3,%ymm3");
    1493     2288112 :                         asm volatile ("vpxor   %ymm13,%ymm3,%ymm3");
    1494             : 
    1495     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][2][0][0]));
    1496     2288112 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][2][1][0]));
    1497     2288112 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1498     2288112 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1499     2288112 :                         asm volatile ("vpxor   %ymm12,%ymm4,%ymm4");
    1500     2288112 :                         asm volatile ("vpxor   %ymm13,%ymm4,%ymm4");
    1501             :                 }
    1502             : 
    1503             :                 /* first disk with all coefficients at 1 */
    1504      310408 :                 asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[0][i]));
    1505             : 
    1506      310408 :                 asm volatile ("vpcmpgtb %ymm1,%ymm8,%ymm11");
    1507      310408 :                 asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1508      310408 :                 asm volatile ("vpand %ymm14,%ymm11,%ymm11");
    1509      310408 :                 asm volatile ("vpxor %ymm11,%ymm1,%ymm1");
    1510             : 
    1511      310408 :                 asm volatile ("vpxor %ymm10,%ymm0,%ymm0");
    1512      310408 :                 asm volatile ("vpxor %ymm10,%ymm1,%ymm1");
    1513      310408 :                 asm volatile ("vpxor %ymm10,%ymm2,%ymm2");
    1514      310408 :                 asm volatile ("vpxor %ymm10,%ymm3,%ymm3");
    1515      310408 :                 asm volatile ("vpxor %ymm10,%ymm4,%ymm4");
    1516             : 
    1517      310408 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
    1518      310408 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (q[i]));
    1519      310408 :                 asm volatile ("vmovntdq %%ymm2,%0" : "=m" (r[i]));
    1520      310408 :                 asm volatile ("vmovntdq %%ymm3,%0" : "=m" (s[i]));
    1521      310408 :                 asm volatile ("vmovntdq %%ymm4,%0" : "=m" (t[i]));
    1522             :         }
    1523             : 
    1524             :         raid_avx_end();
    1525             : }
    1526             : #endif
    1527             : 
    1528             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
    1529             : /*
    1530             :  * GEN6 (hexa parity with Cauchy matrix) SSSE3 implementation
    1531             :  */
    1532          12 : void raid_gen6_ssse3(int nd, size_t size, void **vv)
    1533             : {
    1534          12 :         uint8_t **v = (uint8_t **)vv;
    1535             :         uint8_t *p;
    1536             :         uint8_t *q;
    1537             :         uint8_t *r;
    1538             :         uint8_t *s;
    1539             :         uint8_t *t;
    1540             :         uint8_t *u;
    1541             :         int d, l;
    1542             :         size_t i;
    1543             :         uint8_t buffer[2*16+16];
    1544          12 :         uint8_t *pd = __align_ptr(buffer, 16);
    1545             : 
    1546          12 :         l = nd - 1;
    1547          12 :         p = v[nd];
    1548          12 :         q = v[nd + 1];
    1549          12 :         r = v[nd + 2];
    1550          12 :         s = v[nd + 3];
    1551          12 :         t = v[nd + 4];
    1552          12 :         u = v[nd + 5];
    1553             : 
    1554             :         /* special case with only one data disk */
    1555          12 :         if (l == 0) {
    1556           7 :                 for (i = 0; i < 6; ++i)
    1557           6 :                         memcpy(v[1 + i], v[0], size);
    1558           1 :                 return;
    1559             :         }
    1560             : 
    1561             :         raid_sse_begin();
    1562             : 
    1563             :         /* generic case with at least two data disks */
    1564      163867 :         for (i = 0; i < size; i += 16) {
    1565             :                 /* last disk without the by two multiplication */
    1566      163856 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[l][i]));
    1567             : 
    1568      163856 :                 asm volatile ("movdqa %%xmm4,%0" : "=m" (pd[0]));
    1569      163856 :                 asm volatile ("movdqa %%xmm4,%0" : "=m" (pd[16]));
    1570             : 
    1571      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    1572      163856 :                 asm volatile ("movdqa %xmm4,%xmm5");
    1573      163856 :                 asm volatile ("psrlw  $4,%xmm5");
    1574      163856 :                 asm volatile ("pand   %xmm7,%xmm4");
    1575      163856 :                 asm volatile ("pand   %xmm7,%xmm5");
    1576             : 
    1577      163856 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (gfgenpshufb[l][0][0][0]));
    1578      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][0][1][0]));
    1579      163856 :                 asm volatile ("pshufb %xmm4,%xmm0");
    1580      163856 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1581      163856 :                 asm volatile ("pxor   %xmm7,%xmm0");
    1582             : 
    1583      163856 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (gfgenpshufb[l][1][0][0]));
    1584      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][1][1][0]));
    1585      163856 :                 asm volatile ("pshufb %xmm4,%xmm1");
    1586      163856 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1587      163856 :                 asm volatile ("pxor   %xmm7,%xmm1");
    1588             : 
    1589      163856 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][2][0][0]));
    1590      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][2][1][0]));
    1591      163856 :                 asm volatile ("pshufb %xmm4,%xmm2");
    1592      163856 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1593      163856 :                 asm volatile ("pxor   %xmm7,%xmm2");
    1594             : 
    1595      163856 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][3][0][0]));
    1596      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[l][3][1][0]));
    1597      163856 :                 asm volatile ("pshufb %xmm4,%xmm3");
    1598      163856 :                 asm volatile ("pshufb %xmm5,%xmm7");
    1599      163856 :                 asm volatile ("pxor   %xmm7,%xmm3");
    1600             : 
    1601             :                 /* intermediate disks */
    1602     1147376 :                 for (d = l - 1; d > 0; --d) {
    1603      983520 :                         asm volatile ("movdqa %0,%%xmm5" : : "m" (pd[0]));
    1604      983520 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (pd[16]));
    1605      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
    1606             : 
    1607      983520 :                         asm volatile ("pxor %xmm4,%xmm4");
    1608      983520 :                         asm volatile ("pcmpgtb %xmm6,%xmm4");
    1609      983520 :                         asm volatile ("paddb %xmm6,%xmm6");
    1610      983520 :                         asm volatile ("pand %xmm7,%xmm4");
    1611      983520 :                         asm volatile ("pxor %xmm4,%xmm6");
    1612             : 
    1613      983520 :                         asm volatile ("movdqa %0,%%xmm4" : : "m" (v[d][i]));
    1614             : 
    1615      983520 :                         asm volatile ("pxor %xmm4,%xmm5");
    1616      983520 :                         asm volatile ("pxor %xmm4,%xmm6");
    1617      983520 :                         asm volatile ("movdqa %%xmm5,%0" : "=m" (pd[0]));
    1618      983520 :                         asm volatile ("movdqa %%xmm6,%0" : "=m" (pd[16]));
    1619             : 
    1620      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    1621      983520 :                         asm volatile ("movdqa %xmm4,%xmm5");
    1622      983520 :                         asm volatile ("psrlw  $4,%xmm5");
    1623      983520 :                         asm volatile ("pand   %xmm7,%xmm4");
    1624      983520 :                         asm volatile ("pand   %xmm7,%xmm5");
    1625             : 
    1626      983520 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][0][0][0]));
    1627      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][0][1][0]));
    1628      983520 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1629      983520 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1630      983520 :                         asm volatile ("pxor   %xmm6,%xmm0");
    1631      983520 :                         asm volatile ("pxor   %xmm7,%xmm0");
    1632             : 
    1633      983520 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][1][0][0]));
    1634      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][1][1][0]));
    1635      983520 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1636      983520 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1637      983520 :                         asm volatile ("pxor   %xmm6,%xmm1");
    1638      983520 :                         asm volatile ("pxor   %xmm7,%xmm1");
    1639             : 
    1640      983520 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][2][0][0]));
    1641      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][2][1][0]));
    1642      983520 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1643      983520 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1644      983520 :                         asm volatile ("pxor   %xmm6,%xmm2");
    1645      983520 :                         asm volatile ("pxor   %xmm7,%xmm2");
    1646             : 
    1647      983520 :                         asm volatile ("movdqa %0,%%xmm6" : : "m" (gfgenpshufb[d][3][0][0]));
    1648      983520 :                         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfgenpshufb[d][3][1][0]));
    1649      983520 :                         asm volatile ("pshufb %xmm4,%xmm6");
    1650      983520 :                         asm volatile ("pshufb %xmm5,%xmm7");
    1651      983520 :                         asm volatile ("pxor   %xmm6,%xmm3");
    1652      983520 :                         asm volatile ("pxor   %xmm7,%xmm3");
    1653             :                 }
    1654             : 
    1655             :                 /* first disk with all coefficients at 1 */
    1656      163856 :                 asm volatile ("movdqa %0,%%xmm5" : : "m" (pd[0]));
    1657      163856 :                 asm volatile ("movdqa %0,%%xmm6" : : "m" (pd[16]));
    1658      163856 :                 asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.poly[0]));
    1659             : 
    1660      163856 :                 asm volatile ("pxor %xmm4,%xmm4");
    1661      163856 :                 asm volatile ("pcmpgtb %xmm6,%xmm4");
    1662      163856 :                 asm volatile ("paddb %xmm6,%xmm6");
    1663      163856 :                 asm volatile ("pand %xmm7,%xmm4");
    1664      163856 :                 asm volatile ("pxor %xmm4,%xmm6");
    1665             : 
    1666      163856 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (v[0][i]));
    1667      163856 :                 asm volatile ("pxor %xmm4,%xmm0");
    1668      163856 :                 asm volatile ("pxor %xmm4,%xmm1");
    1669      163856 :                 asm volatile ("pxor %xmm4,%xmm2");
    1670      163856 :                 asm volatile ("pxor %xmm4,%xmm3");
    1671      163856 :                 asm volatile ("pxor %xmm4,%xmm5");
    1672      163856 :                 asm volatile ("pxor %xmm4,%xmm6");
    1673             : 
    1674      163856 :                 asm volatile ("movntdq %%xmm5,%0" : "=m" (p[i]));
    1675      163856 :                 asm volatile ("movntdq %%xmm6,%0" : "=m" (q[i]));
    1676      163856 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (r[i]));
    1677      163856 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (s[i]));
    1678      163856 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (t[i]));
    1679      163856 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (u[i]));
    1680             :         }
    1681             : 
    1682             :         raid_sse_end();
    1683             : }
    1684             : #endif
    1685             : 
    1686             : #if defined(CONFIG_X86_64) && defined(CONFIG_SSSE3)
    1687             : /*
    1688             :  * GEN6 (hexa parity with Cauchy matrix) SSSE3 implementation
    1689             :  *
    1690             :  * Note that it uses 16 registers, meaning that x64 is required.
    1691             :  */
    1692      526942 : void raid_gen6_ssse3ext(int nd, size_t size, void **vv)
    1693             : {
    1694      526942 :         uint8_t **v = (uint8_t **)vv;
    1695             :         uint8_t *p;
    1696             :         uint8_t *q;
    1697             :         uint8_t *r;
    1698             :         uint8_t *s;
    1699             :         uint8_t *t;
    1700             :         uint8_t *u;
    1701             :         int d, l;
    1702             :         size_t i;
    1703             : 
    1704      526942 :         l = nd - 1;
    1705      526942 :         p = v[nd];
    1706      526942 :         q = v[nd + 1];
    1707      526942 :         r = v[nd + 2];
    1708      526942 :         s = v[nd + 3];
    1709      526942 :         t = v[nd + 4];
    1710      526942 :         u = v[nd + 5];
    1711             : 
    1712             :         /* special case with only one data disk */
    1713      526942 :         if (l == 0) {
    1714           7 :                 for (i = 0; i < 6; ++i)
    1715           6 :                         memcpy(v[1 + i], v[0], size);
    1716           1 :                 return;
    1717             :         }
    1718             : 
    1719             :         raid_sse_begin();
    1720             : 
    1721             :         /* generic case with at least two data disks */
    1722      526941 :         asm volatile ("movdqa %0,%%xmm14" : : "m" (gfconst16.poly[0]));
    1723      526941 :         asm volatile ("movdqa %0,%%xmm15" : : "m" (gfconst16.low4[0]));
    1724             : 
    1725    35067117 :         for (i = 0; i < size; i += 16) {
    1726             :                 /* last disk without the by two multiplication */
    1727    34540176 :                 asm volatile ("movdqa %0,%%xmm10" : : "m" (v[l][i]));
    1728             : 
    1729    34540176 :                 asm volatile ("movdqa %xmm10,%xmm0");
    1730    34540176 :                 asm volatile ("movdqa %xmm10,%xmm1");
    1731             : 
    1732    34540176 :                 asm volatile ("movdqa %xmm10,%xmm11");
    1733    34540176 :                 asm volatile ("psrlw  $4,%xmm11");
    1734    34540176 :                 asm volatile ("pand   %xmm15,%xmm10");
    1735    34540176 :                 asm volatile ("pand   %xmm15,%xmm11");
    1736             : 
    1737    34540176 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfgenpshufb[l][0][0][0]));
    1738    34540176 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][0][1][0]));
    1739    34540176 :                 asm volatile ("pshufb %xmm10,%xmm2");
    1740    34540176 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1741    34540176 :                 asm volatile ("pxor   %xmm13,%xmm2");
    1742             : 
    1743    34540176 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfgenpshufb[l][1][0][0]));
    1744    34540176 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][1][1][0]));
    1745    34540176 :                 asm volatile ("pshufb %xmm10,%xmm3");
    1746    34540176 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1747    34540176 :                 asm volatile ("pxor   %xmm13,%xmm3");
    1748             : 
    1749    34540176 :                 asm volatile ("movdqa %0,%%xmm4" : : "m" (gfgenpshufb[l][2][0][0]));
    1750    34540176 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][2][1][0]));
    1751    34540176 :                 asm volatile ("pshufb %xmm10,%xmm4");
    1752    34540176 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1753    34540176 :                 asm volatile ("pxor   %xmm13,%xmm4");
    1754             : 
    1755    34540176 :                 asm volatile ("movdqa %0,%%xmm5" : : "m" (gfgenpshufb[l][3][0][0]));
    1756    34540176 :                 asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[l][3][1][0]));
    1757    34540176 :                 asm volatile ("pshufb %xmm10,%xmm5");
    1758    34540176 :                 asm volatile ("pshufb %xmm11,%xmm13");
    1759    34540176 :                 asm volatile ("pxor   %xmm13,%xmm5");
    1760             : 
    1761             :                 /* intermediate disks */
    1762   174339696 :                 for (d = l - 1; d > 0; --d) {
    1763   139799520 :                         asm volatile ("movdqa %0,%%xmm10" : : "m" (v[d][i]));
    1764             : 
    1765   139799520 :                         asm volatile ("pxor %xmm11,%xmm11");
    1766   139799520 :                         asm volatile ("pcmpgtb %xmm1,%xmm11");
    1767   139799520 :                         asm volatile ("paddb %xmm1,%xmm1");
    1768   139799520 :                         asm volatile ("pand %xmm14,%xmm11");
    1769   139799520 :                         asm volatile ("pxor %xmm11,%xmm1");
    1770             : 
    1771   139799520 :                         asm volatile ("pxor %xmm10,%xmm0");
    1772   139799520 :                         asm volatile ("pxor %xmm10,%xmm1");
    1773             : 
    1774   139799520 :                         asm volatile ("movdqa %xmm10,%xmm11");
    1775   139799520 :                         asm volatile ("psrlw  $4,%xmm11");
    1776   139799520 :                         asm volatile ("pand   %xmm15,%xmm10");
    1777   139799520 :                         asm volatile ("pand   %xmm15,%xmm11");
    1778             : 
    1779   139799520 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][0][0][0]));
    1780   139799520 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][0][1][0]));
    1781   139799520 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1782   139799520 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1783   139799520 :                         asm volatile ("pxor   %xmm12,%xmm2");
    1784   139799520 :                         asm volatile ("pxor   %xmm13,%xmm2");
    1785             : 
    1786   139799520 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][1][0][0]));
    1787   139799520 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][1][1][0]));
    1788   139799520 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1789   139799520 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1790   139799520 :                         asm volatile ("pxor   %xmm12,%xmm3");
    1791   139799520 :                         asm volatile ("pxor   %xmm13,%xmm3");
    1792             : 
    1793   139799520 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][2][0][0]));
    1794   139799520 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][2][1][0]));
    1795   139799520 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1796   139799520 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1797   139799520 :                         asm volatile ("pxor   %xmm12,%xmm4");
    1798   139799520 :                         asm volatile ("pxor   %xmm13,%xmm4");
    1799             : 
    1800   139799520 :                         asm volatile ("movdqa %0,%%xmm12" : : "m" (gfgenpshufb[d][3][0][0]));
    1801   139799520 :                         asm volatile ("movdqa %0,%%xmm13" : : "m" (gfgenpshufb[d][3][1][0]));
    1802   139799520 :                         asm volatile ("pshufb %xmm10,%xmm12");
    1803   139799520 :                         asm volatile ("pshufb %xmm11,%xmm13");
    1804   139799520 :                         asm volatile ("pxor   %xmm12,%xmm5");
    1805   139799520 :                         asm volatile ("pxor   %xmm13,%xmm5");
    1806             :                 }
    1807             : 
    1808             :                 /* first disk with all coefficients at 1 */
    1809    34540176 :                 asm volatile ("movdqa %0,%%xmm10" : : "m" (v[0][i]));
    1810             : 
    1811    34540176 :                 asm volatile ("pxor %xmm11,%xmm11");
    1812    34540176 :                 asm volatile ("pcmpgtb %xmm1,%xmm11");
    1813    34540176 :                 asm volatile ("paddb %xmm1,%xmm1");
    1814    34540176 :                 asm volatile ("pand %xmm14,%xmm11");
    1815    34540176 :                 asm volatile ("pxor %xmm11,%xmm1");
    1816             : 
    1817    34540176 :                 asm volatile ("pxor %xmm10,%xmm0");
    1818    34540176 :                 asm volatile ("pxor %xmm10,%xmm1");
    1819    34540176 :                 asm volatile ("pxor %xmm10,%xmm2");
    1820    34540176 :                 asm volatile ("pxor %xmm10,%xmm3");
    1821    34540176 :                 asm volatile ("pxor %xmm10,%xmm4");
    1822    34540176 :                 asm volatile ("pxor %xmm10,%xmm5");
    1823             : 
    1824    34540176 :                 asm volatile ("movntdq %%xmm0,%0" : "=m" (p[i]));
    1825    34540176 :                 asm volatile ("movntdq %%xmm1,%0" : "=m" (q[i]));
    1826    34540176 :                 asm volatile ("movntdq %%xmm2,%0" : "=m" (r[i]));
    1827    34540176 :                 asm volatile ("movntdq %%xmm3,%0" : "=m" (s[i]));
    1828    34540176 :                 asm volatile ("movntdq %%xmm4,%0" : "=m" (t[i]));
    1829    34540176 :                 asm volatile ("movntdq %%xmm5,%0" : "=m" (u[i]));
    1830             :         }
    1831             : 
    1832             :         raid_sse_end();
    1833             : }
    1834             : #endif
    1835             : 
    1836             : #if defined(CONFIG_X86_64) && defined(CONFIG_AVX2)
    1837             : /*
    1838             :  * GEN6 (hexa parity with Cauchy matrix) AVX2 implementation
    1839             :  *
    1840             :  * Note that it uses 16 registers, meaning that x64 is required.
    1841             :  */
    1842       37161 : void raid_gen6_avx2ext(int nd, size_t size, void **vv)
    1843             : {
    1844       37161 :         uint8_t **v = (uint8_t **)vv;
    1845             :         uint8_t *p;
    1846             :         uint8_t *q;
    1847             :         uint8_t *r;
    1848             :         uint8_t *s;
    1849             :         uint8_t *t;
    1850             :         uint8_t *u;
    1851             :         int d, l;
    1852             :         size_t i;
    1853             : 
    1854       37161 :         l = nd - 1;
    1855       37161 :         p = v[nd];
    1856       37161 :         q = v[nd + 1];
    1857       37161 :         r = v[nd + 2];
    1858       37161 :         s = v[nd + 3];
    1859       37161 :         t = v[nd + 4];
    1860       37161 :         u = v[nd + 5];
    1861             : 
    1862             :         /* special case with only one data disk */
    1863       37161 :         if (l == 0) {
    1864           7 :                 for (i = 0; i < 6; ++i)
    1865           6 :                         memcpy(v[1 + i], v[0], size);
    1866           1 :                 return;
    1867             :         }
    1868             : 
    1869             :         raid_avx_begin();
    1870             : 
    1871             :         /* generic case with at least two data disks */
    1872       37160 :         asm volatile ("vpxor %ymm8,%ymm8,%ymm8");
    1873       37160 :         asm volatile ("vbroadcasti128 %0,%%ymm14" : : "m" (gfconst16.poly[0]));
    1874       37160 :         asm volatile ("vbroadcasti128 %0,%%ymm15" : : "m" (gfconst16.low4[0]));
    1875             : 
    1876      539760 :         for (i = 0; i < size; i += 32) {
    1877             :                 /* last disk without the by two multiplication */
    1878      502600 :                 asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[l][i]));
    1879             : 
    1880      502600 :                 asm volatile ("vmovdqa %ymm10,%ymm0");
    1881      502600 :                 asm volatile ("vmovdqa %ymm10,%ymm1");
    1882             : 
    1883      502600 :                 asm volatile ("vpsrlw  $4,%ymm10,%ymm11");
    1884      502600 :                 asm volatile ("vpand   %ymm15,%ymm10,%ymm10");
    1885      502600 :                 asm volatile ("vpand   %ymm15,%ymm11,%ymm11");
    1886             : 
    1887      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfgenpshufb[l][0][0][0]));
    1888      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][0][1][0]));
    1889      502600 :                 asm volatile ("vpshufb %ymm10,%ymm2,%ymm2");
    1890      502600 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1891      502600 :                 asm volatile ("vpxor   %ymm13,%ymm2,%ymm2");
    1892             : 
    1893      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfgenpshufb[l][1][0][0]));
    1894      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][1][1][0]));
    1895      502600 :                 asm volatile ("vpshufb %ymm10,%ymm3,%ymm3");
    1896      502600 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1897      502600 :                 asm volatile ("vpxor   %ymm13,%ymm3,%ymm3");
    1898             : 
    1899      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm4" : : "m" (gfgenpshufb[l][2][0][0]));
    1900      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][2][1][0]));
    1901      502600 :                 asm volatile ("vpshufb %ymm10,%ymm4,%ymm4");
    1902      502600 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1903      502600 :                 asm volatile ("vpxor   %ymm13,%ymm4,%ymm4");
    1904             : 
    1905      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm5" : : "m" (gfgenpshufb[l][3][0][0]));
    1906      502600 :                 asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[l][3][1][0]));
    1907      502600 :                 asm volatile ("vpshufb %ymm10,%ymm5,%ymm5");
    1908      502600 :                 asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1909      502600 :                 asm volatile ("vpxor   %ymm13,%ymm5,%ymm5");
    1910             : 
    1911             :                 /* intermediate disks */
    1912     4712632 :                 for (d = l - 1; d > 0; --d) {
    1913     4210032 :                         asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[d][i]));
    1914             : 
    1915     4210032 :                         asm volatile ("vpcmpgtb %ymm1,%ymm8,%ymm11");
    1916     4210032 :                         asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1917     4210032 :                         asm volatile ("vpand %ymm14,%ymm11,%ymm11");
    1918     4210032 :                         asm volatile ("vpxor %ymm11,%ymm1,%ymm1");
    1919             : 
    1920     4210032 :                         asm volatile ("vpxor %ymm10,%ymm0,%ymm0");
    1921     4210032 :                         asm volatile ("vpxor %ymm10,%ymm1,%ymm1");
    1922             : 
    1923     4210032 :                         asm volatile ("vpsrlw  $4,%ymm10,%ymm11");
    1924     4210032 :                         asm volatile ("vpand   %ymm15,%ymm10,%ymm10");
    1925     4210032 :                         asm volatile ("vpand   %ymm15,%ymm11,%ymm11");
    1926             : 
    1927     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][0][0][0]));
    1928     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][0][1][0]));
    1929     4210032 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1930     4210032 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1931     4210032 :                         asm volatile ("vpxor   %ymm12,%ymm2,%ymm2");
    1932     4210032 :                         asm volatile ("vpxor   %ymm13,%ymm2,%ymm2");
    1933             : 
    1934     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][1][0][0]));
    1935     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][1][1][0]));
    1936     4210032 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1937     4210032 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1938     4210032 :                         asm volatile ("vpxor   %ymm12,%ymm3,%ymm3");
    1939     4210032 :                         asm volatile ("vpxor   %ymm13,%ymm3,%ymm3");
    1940             : 
    1941     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][2][0][0]));
    1942     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][2][1][0]));
    1943     4210032 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1944     4210032 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1945     4210032 :                         asm volatile ("vpxor   %ymm12,%ymm4,%ymm4");
    1946     4210032 :                         asm volatile ("vpxor   %ymm13,%ymm4,%ymm4");
    1947             : 
    1948     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm12" : : "m" (gfgenpshufb[d][3][0][0]));
    1949     4210032 :                         asm volatile ("vbroadcasti128 %0,%%ymm13" : : "m" (gfgenpshufb[d][3][1][0]));
    1950     4210032 :                         asm volatile ("vpshufb %ymm10,%ymm12,%ymm12");
    1951     4210032 :                         asm volatile ("vpshufb %ymm11,%ymm13,%ymm13");
    1952     4210032 :                         asm volatile ("vpxor   %ymm12,%ymm5,%ymm5");
    1953     4210032 :                         asm volatile ("vpxor   %ymm13,%ymm5,%ymm5");
    1954             :                 }
    1955             : 
    1956             :                 /* first disk with all coefficients at 1 */
    1957      502600 :                 asm volatile ("vmovdqa %0,%%ymm10" : : "m" (v[0][i]));
    1958             : 
    1959      502600 :                 asm volatile ("vpcmpgtb %ymm1,%ymm8,%ymm11");
    1960      502600 :                 asm volatile ("vpaddb %ymm1,%ymm1,%ymm1");
    1961      502600 :                 asm volatile ("vpand %ymm14,%ymm11,%ymm11");
    1962      502600 :                 asm volatile ("vpxor %ymm11,%ymm1,%ymm1");
    1963             : 
    1964      502600 :                 asm volatile ("vpxor %ymm10,%ymm0,%ymm0");
    1965      502600 :                 asm volatile ("vpxor %ymm10,%ymm1,%ymm1");
    1966      502600 :                 asm volatile ("vpxor %ymm10,%ymm2,%ymm2");
    1967      502600 :                 asm volatile ("vpxor %ymm10,%ymm3,%ymm3");
    1968      502600 :                 asm volatile ("vpxor %ymm10,%ymm4,%ymm4");
    1969      502600 :                 asm volatile ("vpxor %ymm10,%ymm5,%ymm5");
    1970             : 
    1971      502600 :                 asm volatile ("vmovntdq %%ymm0,%0" : "=m" (p[i]));
    1972      502600 :                 asm volatile ("vmovntdq %%ymm1,%0" : "=m" (q[i]));
    1973      502600 :                 asm volatile ("vmovntdq %%ymm2,%0" : "=m" (r[i]));
    1974      502600 :                 asm volatile ("vmovntdq %%ymm3,%0" : "=m" (s[i]));
    1975      502600 :                 asm volatile ("vmovntdq %%ymm4,%0" : "=m" (t[i]));
    1976      502600 :                 asm volatile ("vmovntdq %%ymm5,%0" : "=m" (u[i]));
    1977             :         }
    1978             : 
    1979             :         raid_avx_end();
    1980             : }
    1981             : #endif
    1982             : 
    1983             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
    1984             : /*
    1985             :  * RAID recovering for one disk SSSE3 implementation
    1986             :  */
    1987      111520 : void raid_rec1_ssse3(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    1988             : {
    1989      111520 :         uint8_t **v = (uint8_t **)vv;
    1990             :         uint8_t *p;
    1991             :         uint8_t *pa;
    1992             :         uint8_t G;
    1993             :         uint8_t V;
    1994             :         size_t i;
    1995             : 
    1996             :         (void)nr; /* unused, it's always 1 */
    1997             : 
    1998             :         /* if it's RAID5 uses the faster function */
    1999      111520 :         if (ip[0] == 0) {
    2000      101501 :                 raid_rec1of1(id, nd, size, vv);
    2001      101501 :                 return;
    2002             :         }
    2003             : 
    2004             :         /* setup the coefficients matrix */
    2005       20038 :         G = A(ip[0], id[0]);
    2006             : 
    2007             :         /* invert it to solve the system of linear equations */
    2008       20038 :         V = inv(G);
    2009             : 
    2010             :         /* compute delta parity */
    2011       10019 :         raid_delta_gen(1, id, ip, nd, size, vv);
    2012             : 
    2013       10019 :         p = v[nd + ip[0]];
    2014       10019 :         pa = v[id[0]];
    2015             : 
    2016             :         raid_sse_begin();
    2017             : 
    2018       10019 :         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    2019       10019 :         asm volatile ("movdqa %0,%%xmm4" : : "m" (gfmulpshufb[V][0][0]));
    2020       10019 :         asm volatile ("movdqa %0,%%xmm5" : : "m" (gfmulpshufb[V][1][0]));
    2021             : 
    2022     1561123 :         for (i = 0; i < size; i += 16) {
    2023     1551104 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (p[i]));
    2024     1551104 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (pa[i]));
    2025     1551104 :                 asm volatile ("movdqa %xmm4,%xmm2");
    2026     1551104 :                 asm volatile ("movdqa %xmm5,%xmm3");
    2027     1551104 :                 asm volatile ("pxor   %xmm0,%xmm1");
    2028     1551104 :                 asm volatile ("movdqa %xmm1,%xmm0");
    2029     1551104 :                 asm volatile ("psrlw  $4,%xmm1");
    2030     1551104 :                 asm volatile ("pand   %xmm7,%xmm0");
    2031     1551104 :                 asm volatile ("pand   %xmm7,%xmm1");
    2032     1551104 :                 asm volatile ("pshufb %xmm0,%xmm2");
    2033     1551104 :                 asm volatile ("pshufb %xmm1,%xmm3");
    2034     1551104 :                 asm volatile ("pxor   %xmm3,%xmm2");
    2035     1551104 :                 asm volatile ("movdqa %%xmm2,%0" : "=m" (pa[i]));
    2036             :         }
    2037             : 
    2038             :         raid_sse_end();
    2039             : }
    2040             : #endif
    2041             : 
    2042             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
    2043             : /*
    2044             :  * RAID recovering for two disks SSSE3 implementation
    2045             :  */
    2046       44318 : void raid_rec2_ssse3(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    2047       44318 : {
    2048       44318 :         uint8_t **v = (uint8_t **)vv;
    2049       44318 :         const int N = 2;
    2050       44318 :         uint8_t *p[N];
    2051       44318 :         uint8_t *pa[N];
    2052       44318 :         uint8_t G[N * N];
    2053       44318 :         uint8_t V[N * N];
    2054             :         size_t i;
    2055             :         int j, k;
    2056             : 
    2057             :         (void)nr; /* unused, it's always 2 */
    2058             : 
    2059             :         /* setup the coefficients matrix */
    2060      132954 :         for (j = 0; j < N; ++j)
    2061      265908 :                 for (k = 0; k < N; ++k)
    2062      354544 :                         G[j * N + k] = A(ip[j], id[k]);
    2063             : 
    2064             :         /* invert it to solve the system of linear equations */
    2065       44318 :         raid_invert(G, V, N);
    2066             : 
    2067             :         /* compute delta parity */
    2068       44318 :         raid_delta_gen(N, id, ip, nd, size, vv);
    2069             : 
    2070      132954 :         for (j = 0; j < N; ++j) {
    2071       88636 :                 p[j] = v[nd + ip[j]];
    2072       88636 :                 pa[j] = v[id[j]];
    2073             :         }
    2074             : 
    2075             :         raid_sse_begin();
    2076             : 
    2077       44318 :         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    2078             : 
    2079     3476446 :         for (i = 0; i < size; i += 16) {
    2080     3432128 :                 asm volatile ("movdqa %0,%%xmm0" : : "m" (p[0][i]));
    2081     3432128 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (pa[0][i]));
    2082     3432128 :                 asm volatile ("movdqa %0,%%xmm1" : : "m" (p[1][i]));
    2083     3432128 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (pa[1][i]));
    2084     3432128 :                 asm volatile ("pxor   %xmm2,%xmm0");
    2085     3432128 :                 asm volatile ("pxor   %xmm3,%xmm1");
    2086             : 
    2087     3432128 :                 asm volatile ("pxor %xmm6,%xmm6");
    2088             : 
    2089     3432128 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfmulpshufb[V[0]][0][0]));
    2090     3432128 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfmulpshufb[V[0]][1][0]));
    2091     3432128 :                 asm volatile ("movdqa %xmm0,%xmm4");
    2092     3432128 :                 asm volatile ("movdqa %xmm0,%xmm5");
    2093     3432128 :                 asm volatile ("psrlw  $4,%xmm5");
    2094     3432128 :                 asm volatile ("pand   %xmm7,%xmm4");
    2095     3432128 :                 asm volatile ("pand   %xmm7,%xmm5");
    2096     3432128 :                 asm volatile ("pshufb %xmm4,%xmm2");
    2097     3432128 :                 asm volatile ("pshufb %xmm5,%xmm3");
    2098     3432128 :                 asm volatile ("pxor   %xmm2,%xmm6");
    2099     3432128 :                 asm volatile ("pxor   %xmm3,%xmm6");
    2100             : 
    2101     3432128 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfmulpshufb[V[1]][0][0]));
    2102     3432128 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfmulpshufb[V[1]][1][0]));
    2103     3432128 :                 asm volatile ("movdqa %xmm1,%xmm4");
    2104     3432128 :                 asm volatile ("movdqa %xmm1,%xmm5");
    2105     3432128 :                 asm volatile ("psrlw  $4,%xmm5");
    2106     3432128 :                 asm volatile ("pand   %xmm7,%xmm4");
    2107     3432128 :                 asm volatile ("pand   %xmm7,%xmm5");
    2108     3432128 :                 asm volatile ("pshufb %xmm4,%xmm2");
    2109     3432128 :                 asm volatile ("pshufb %xmm5,%xmm3");
    2110     3432128 :                 asm volatile ("pxor   %xmm2,%xmm6");
    2111     3432128 :                 asm volatile ("pxor   %xmm3,%xmm6");
    2112             : 
    2113     3432128 :                 asm volatile ("movdqa %%xmm6,%0" : "=m" (pa[0][i]));
    2114             : 
    2115     3432128 :                 asm volatile ("pxor %xmm6,%xmm6");
    2116             : 
    2117     3432128 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfmulpshufb[V[2]][0][0]));
    2118     3432128 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfmulpshufb[V[2]][1][0]));
    2119     3432128 :                 asm volatile ("movdqa %xmm0,%xmm4");
    2120     3432128 :                 asm volatile ("movdqa %xmm0,%xmm5");
    2121     3432128 :                 asm volatile ("psrlw  $4,%xmm5");
    2122     3432128 :                 asm volatile ("pand   %xmm7,%xmm4");
    2123     3432128 :                 asm volatile ("pand   %xmm7,%xmm5");
    2124     3432128 :                 asm volatile ("pshufb %xmm4,%xmm2");
    2125     3432128 :                 asm volatile ("pshufb %xmm5,%xmm3");
    2126     3432128 :                 asm volatile ("pxor   %xmm2,%xmm6");
    2127     3432128 :                 asm volatile ("pxor   %xmm3,%xmm6");
    2128             : 
    2129     3432128 :                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfmulpshufb[V[3]][0][0]));
    2130     3432128 :                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfmulpshufb[V[3]][1][0]));
    2131     3432128 :                 asm volatile ("movdqa %xmm1,%xmm4");
    2132     3432128 :                 asm volatile ("movdqa %xmm1,%xmm5");
    2133     3432128 :                 asm volatile ("psrlw  $4,%xmm5");
    2134     3432128 :                 asm volatile ("pand   %xmm7,%xmm4");
    2135     3432128 :                 asm volatile ("pand   %xmm7,%xmm5");
    2136     3432128 :                 asm volatile ("pshufb %xmm4,%xmm2");
    2137     3432128 :                 asm volatile ("pshufb %xmm5,%xmm3");
    2138     3432128 :                 asm volatile ("pxor   %xmm2,%xmm6");
    2139     3432128 :                 asm volatile ("pxor   %xmm3,%xmm6");
    2140             : 
    2141     3432128 :                 asm volatile ("movdqa %%xmm6,%0" : "=m" (pa[1][i]));
    2142             :         }
    2143             : 
    2144             :         raid_sse_end();
    2145       44318 : }
    2146             : #endif
    2147             : 
    2148             : #if defined(CONFIG_X86) && defined(CONFIG_SSSE3)
    2149             : /*
    2150             :  * RAID recovering SSSE3 implementation
    2151             :  */
    2152       79288 : void raid_recX_ssse3(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    2153             : {
    2154       79288 :         uint8_t **v = (uint8_t **)vv;
    2155       79288 :         int N = nr;
    2156             :         uint8_t *p[RAID_PARITY_MAX];
    2157             :         uint8_t *pa[RAID_PARITY_MAX];
    2158             :         uint8_t G[RAID_PARITY_MAX * RAID_PARITY_MAX];
    2159             :         uint8_t V[RAID_PARITY_MAX * RAID_PARITY_MAX];
    2160             :         uint8_t buffer[RAID_PARITY_MAX*16+16];
    2161       79288 :         uint8_t *pd = __align_ptr(buffer, 16);
    2162             :         size_t i;
    2163             :         int j, k;
    2164             : 
    2165             :         /* setup the coefficients matrix */
    2166      435102 :         for (j = 0; j < N; ++j)
    2167     2046374 :                 for (k = 0; k < N; ++k)
    2168     3381120 :                         G[j * N + k] = A(ip[j], id[k]);
    2169             : 
    2170             :         /* invert it to solve the system of linear equations */
    2171       79288 :         raid_invert(G, V, N);
    2172             : 
    2173             :         /* compute delta parity */
    2174       79288 :         raid_delta_gen(N, id, ip, nd, size, vv);
    2175             : 
    2176      435102 :         for (j = 0; j < N; ++j) {
    2177      355814 :                 p[j] = v[nd + ip[j]];
    2178      355814 :                 pa[j] = v[id[j]];
    2179             :         }
    2180             : 
    2181             :         raid_sse_begin();
    2182             : 
    2183       79288 :         asm volatile ("movdqa %0,%%xmm7" : : "m" (gfconst16.low4[0]));
    2184             : 
    2185     5869832 :         for (i = 0; i < size; i += 16) {
    2186             :                 /* delta */
    2187    32115408 :                 for (j = 0; j < N; ++j) {
    2188    26324864 :                         asm volatile ("movdqa %0,%%xmm0" : : "m" (p[j][i]));
    2189    26324864 :                         asm volatile ("movdqa %0,%%xmm1" : : "m" (pa[j][i]));
    2190    26324864 :                         asm volatile ("pxor   %xmm1,%xmm0");
    2191    26324864 :                         asm volatile ("movdqa %%xmm0,%0" : "=m" (pd[j*16]));
    2192             :                 }
    2193             : 
    2194             :                 /* reconstruct */
    2195    32115408 :                 for (j = 0; j < N; ++j) {
    2196    26324864 :                         asm volatile ("pxor %xmm0,%xmm0");
    2197    26324864 :                         asm volatile ("pxor %xmm1,%xmm1");
    2198             : 
    2199   153207872 :                         for (k = 0; k < N; ++k) {
    2200   126883008 :                                 uint8_t m = V[j * N + k];
    2201             : 
    2202   126883008 :                                 asm volatile ("movdqa %0,%%xmm2" : : "m" (gfmulpshufb[m][0][0]));
    2203   126883008 :                                 asm volatile ("movdqa %0,%%xmm3" : : "m" (gfmulpshufb[m][1][0]));
    2204   126883008 :                                 asm volatile ("movdqa %0,%%xmm4" : : "m" (pd[k*16]));
    2205   126883008 :                                 asm volatile ("movdqa %xmm4,%xmm5");
    2206   126883008 :                                 asm volatile ("psrlw  $4,%xmm5");
    2207   126883008 :                                 asm volatile ("pand   %xmm7,%xmm4");
    2208   126883008 :                                 asm volatile ("pand   %xmm7,%xmm5");
    2209   126883008 :                                 asm volatile ("pshufb %xmm4,%xmm2");
    2210   126883008 :                                 asm volatile ("pshufb %xmm5,%xmm3");
    2211   126883008 :                                 asm volatile ("pxor   %xmm2,%xmm0");
    2212   126883008 :                                 asm volatile ("pxor   %xmm3,%xmm1");
    2213             :                         }
    2214             : 
    2215    26324864 :                         asm volatile ("pxor %xmm1,%xmm0");
    2216    26324864 :                         asm volatile ("movdqa %%xmm0,%0" : "=m" (pa[j][i]));
    2217             :                 }
    2218             :         }
    2219             : 
    2220             :         raid_sse_end();
    2221       79288 : }
    2222             : #endif
    2223             : 
    2224             : #if defined(CONFIG_X86) && defined(CONFIG_AVX2)
    2225             : /*
    2226             :  * RAID recovering for one disk AVX2 implementation
    2227             :  */
    2228         126 : void raid_rec1_avx2(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    2229             : {
    2230         126 :         uint8_t **v = (uint8_t **)vv;
    2231             :         uint8_t *p;
    2232             :         uint8_t *pa;
    2233             :         uint8_t G;
    2234             :         uint8_t V;
    2235             :         size_t i;
    2236             : 
    2237             :         (void)nr; /* unused, it's always 1 */
    2238             : 
    2239             :         /* if it's RAID5 uses the faster function */
    2240         126 :         if (ip[0] == 0) {
    2241          30 :                 raid_rec1of1(id, nd, size, vv);
    2242          30 :                 return;
    2243             :         }
    2244             : 
    2245             :         /* setup the coefficients matrix */
    2246         192 :         G = A(ip[0], id[0]);
    2247             : 
    2248             :         /* invert it to solve the system of linear equations */
    2249         192 :         V = inv(G);
    2250             : 
    2251             :         /* compute delta parity */
    2252          96 :         raid_delta_gen(1, id, ip, nd, size, vv);
    2253             : 
    2254          96 :         p = v[nd + ip[0]];
    2255          96 :         pa = v[id[0]];
    2256             : 
    2257             :         raid_avx_begin();
    2258             : 
    2259          96 :         asm volatile ("vbroadcasti128 %0,%%ymm7" : : "m" (gfconst16.low4[0]));
    2260          96 :         asm volatile ("vbroadcasti128 %0,%%ymm4" : : "m" (gfmulpshufb[V][0][0]));
    2261          96 :         asm volatile ("vbroadcasti128 %0,%%ymm5" : : "m" (gfmulpshufb[V][1][0]));
    2262             : 
    2263       66816 :         for (i = 0; i < size; i += 32) {
    2264       66720 :                 asm volatile ("vmovdqa %0,%%ymm0" : : "m" (p[i]));
    2265       66720 :                 asm volatile ("vmovdqa %0,%%ymm1" : : "m" (pa[i]));
    2266       66720 :                 asm volatile ("vpxor   %ymm1,%ymm0,%ymm0");
    2267       66720 :                 asm volatile ("vpsrlw  $4,%ymm0,%ymm1");
    2268       66720 :                 asm volatile ("vpand   %ymm7,%ymm0,%ymm0");
    2269       66720 :                 asm volatile ("vpand   %ymm7,%ymm1,%ymm1");
    2270       66720 :                 asm volatile ("vpshufb %ymm0,%ymm4,%ymm2");
    2271       66720 :                 asm volatile ("vpshufb %ymm1,%ymm5,%ymm3");
    2272       66720 :                 asm volatile ("vpxor   %ymm3,%ymm2,%ymm2");
    2273       66720 :                 asm volatile ("vmovdqa %%ymm2,%0" : "=m" (pa[i]));
    2274             :         }
    2275             : 
    2276             :         raid_avx_end();
    2277             : }
    2278             : #endif
    2279             : 
    2280             : #if defined(CONFIG_X86) && defined(CONFIG_AVX2)
    2281             : /*
    2282             :  * RAID recovering for two disks AVX2 implementation
    2283             :  */
    2284        1206 : void raid_rec2_avx2(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    2285        1206 : {
    2286        1206 :         uint8_t **v = (uint8_t **)vv;
    2287        1206 :         const int N = 2;
    2288        1206 :         uint8_t *p[N];
    2289        1206 :         uint8_t *pa[N];
    2290        1206 :         uint8_t G[N * N];
    2291        1206 :         uint8_t V[N * N];
    2292             :         size_t i;
    2293             :         int j, k;
    2294             : 
    2295             :         (void)nr; /* unused, it's always 2 */
    2296             : 
    2297             :         /* setup the coefficients matrix */
    2298        3618 :         for (j = 0; j < N; ++j)
    2299        7236 :                 for (k = 0; k < N; ++k)
    2300        9648 :                         G[j * N + k] = A(ip[j], id[k]);
    2301             : 
    2302             :         /* invert it to solve the system of linear equations */
    2303        1206 :         raid_invert(G, V, N);
    2304             : 
    2305             :         /* compute delta parity */
    2306        1206 :         raid_delta_gen(N, id, ip, nd, size, vv);
    2307             : 
    2308        3618 :         for (j = 0; j < N; ++j) {
    2309        2412 :                 p[j] = v[nd + ip[j]];
    2310        2412 :                 pa[j] = v[id[j]];
    2311             :         }
    2312             : 
    2313             :         raid_avx_begin();
    2314             : 
    2315        1206 :         asm volatile ("vbroadcasti128 %0,%%ymm7" : : "m" (gfconst16.low4[0]));
    2316             : 
    2317       77526 :         for (i = 0; i < size; i += 32) {
    2318       76320 :                 asm volatile ("vmovdqa %0,%%ymm0" : : "m" (p[0][i]));
    2319       76320 :                 asm volatile ("vmovdqa %0,%%ymm2" : : "m" (pa[0][i]));
    2320       76320 :                 asm volatile ("vmovdqa %0,%%ymm1" : : "m" (p[1][i]));
    2321       76320 :                 asm volatile ("vmovdqa %0,%%ymm3" : : "m" (pa[1][i]));
    2322       76320 :                 asm volatile ("vpxor   %ymm2,%ymm0,%ymm0");
    2323       76320 :                 asm volatile ("vpxor   %ymm3,%ymm1,%ymm1");
    2324             : 
    2325       76320 :                 asm volatile ("vpxor %ymm6,%ymm6,%ymm6");
    2326             : 
    2327       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfmulpshufb[V[0]][0][0]));
    2328       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfmulpshufb[V[0]][1][0]));
    2329       76320 :                 asm volatile ("vpsrlw  $4,%ymm0,%ymm5");
    2330       76320 :                 asm volatile ("vpand   %ymm7,%ymm0,%ymm4");
    2331       76320 :                 asm volatile ("vpand   %ymm7,%ymm5,%ymm5");
    2332       76320 :                 asm volatile ("vpshufb %ymm4,%ymm2,%ymm2");
    2333       76320 :                 asm volatile ("vpshufb %ymm5,%ymm3,%ymm3");
    2334       76320 :                 asm volatile ("vpxor   %ymm2,%ymm6,%ymm6");
    2335       76320 :                 asm volatile ("vpxor   %ymm3,%ymm6,%ymm6");
    2336             : 
    2337       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfmulpshufb[V[1]][0][0]));
    2338       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfmulpshufb[V[1]][1][0]));
    2339       76320 :                 asm volatile ("vpsrlw  $4,%ymm1,%ymm5");
    2340       76320 :                 asm volatile ("vpand   %ymm7,%ymm1,%ymm4");
    2341       76320 :                 asm volatile ("vpand   %ymm7,%ymm5,%ymm5");
    2342       76320 :                 asm volatile ("vpshufb %ymm4,%ymm2,%ymm2");
    2343       76320 :                 asm volatile ("vpshufb %ymm5,%ymm3,%ymm3");
    2344       76320 :                 asm volatile ("vpxor   %ymm2,%ymm6,%ymm6");
    2345       76320 :                 asm volatile ("vpxor   %ymm3,%ymm6,%ymm6");
    2346             : 
    2347       76320 :                 asm volatile ("vmovdqa %%ymm6,%0" : "=m" (pa[0][i]));
    2348             : 
    2349       76320 :                 asm volatile ("vpxor %ymm6,%ymm6,%ymm6");
    2350             : 
    2351       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfmulpshufb[V[2]][0][0]));
    2352       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfmulpshufb[V[2]][1][0]));
    2353       76320 :                 asm volatile ("vpsrlw  $4,%ymm0,%ymm5");
    2354       76320 :                 asm volatile ("vpand   %ymm7,%ymm0,%ymm4");
    2355       76320 :                 asm volatile ("vpand   %ymm7,%ymm5,%ymm5");
    2356       76320 :                 asm volatile ("vpshufb %ymm4,%ymm2,%ymm2");
    2357       76320 :                 asm volatile ("vpshufb %ymm5,%ymm3,%ymm3");
    2358       76320 :                 asm volatile ("vpxor   %ymm2,%ymm6,%ymm6");
    2359       76320 :                 asm volatile ("vpxor   %ymm3,%ymm6,%ymm6");
    2360             : 
    2361       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfmulpshufb[V[3]][0][0]));
    2362       76320 :                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfmulpshufb[V[3]][1][0]));
    2363       76320 :                 asm volatile ("vpsrlw  $4,%ymm1,%ymm5");
    2364       76320 :                 asm volatile ("vpand   %ymm7,%ymm1,%ymm4");
    2365       76320 :                 asm volatile ("vpand   %ymm7,%ymm5,%ymm5");
    2366       76320 :                 asm volatile ("vpshufb %ymm4,%ymm2,%ymm2");
    2367       76320 :                 asm volatile ("vpshufb %ymm5,%ymm3,%ymm3");
    2368       76320 :                 asm volatile ("vpxor   %ymm2,%ymm6,%ymm6");
    2369       76320 :                 asm volatile ("vpxor   %ymm3,%ymm6,%ymm6");
    2370             : 
    2371       76320 :                 asm volatile ("vmovdqa %%ymm6,%0" : "=m" (pa[1][i]));
    2372             :         }
    2373             : 
    2374             :         raid_avx_end();
    2375        1206 : }
    2376             : #endif
    2377             : 
    2378             : #if defined(CONFIG_X86) && defined(CONFIG_AVX2)
    2379             : /*
    2380             :  * RAID recovering AVX2 implementation
    2381             :  */
    2382       17765 : void raid_recX_avx2(int nr, int *id, int *ip, int nd, size_t size, void **vv)
    2383             : {
    2384       17765 :         uint8_t **v = (uint8_t **)vv;
    2385       17765 :         int N = nr;
    2386             :         uint8_t *p[RAID_PARITY_MAX];
    2387             :         uint8_t *pa[RAID_PARITY_MAX];
    2388             :         uint8_t G[RAID_PARITY_MAX * RAID_PARITY_MAX];
    2389             :         uint8_t V[RAID_PARITY_MAX * RAID_PARITY_MAX];
    2390             :         uint8_t buffer[RAID_PARITY_MAX*32+32];
    2391       17765 :         uint8_t *pd = __align_ptr(buffer, 32);
    2392             :         size_t i;
    2393             :         int j, k;
    2394             : 
    2395             :         /* setup the coefficients matrix */
    2396       90821 :         for (j = 0; j < N; ++j)
    2397      386396 :                 for (k = 0; k < N; ++k)
    2398      626680 :                         G[j * N + k] = A(ip[j], id[k]);
    2399             : 
    2400             :         /* invert it to solve the system of linear equations */
    2401       17765 :         raid_invert(G, V, N);
    2402             : 
    2403             :         /* compute delta parity */
    2404       17765 :         raid_delta_gen(N, id, ip, nd, size, vv);
    2405             : 
    2406       90821 :         for (j = 0; j < N; ++j) {
    2407       73056 :                 p[j] = v[nd + ip[j]];
    2408       73056 :                 pa[j] = v[id[j]];
    2409             :         }
    2410             : 
    2411             :         raid_avx_begin();
    2412             : 
    2413       17765 :         asm volatile ("vbroadcasti128 %0,%%ymm7" : : "m" (gfconst16.low4[0]));
    2414             : 
    2415      423213 :         for (i = 0; i < size; i += 32) {
    2416             :                 /* delta */
    2417     2174152 :                 for (j = 0; j < N; ++j) {
    2418     1768704 :                         asm volatile ("vmovdqa %0,%%ymm0" : : "m" (p[j][i]));
    2419     1768704 :                         asm volatile ("vmovdqa %0,%%ymm1" : : "m" (pa[j][i]));
    2420     1768704 :                         asm volatile ("vpxor   %ymm1,%ymm0,%ymm0");
    2421     1768704 :                         asm volatile ("vmovdqa %%ymm0,%0" : "=m" (pd[j*32]));
    2422             :                 }
    2423             : 
    2424             :                 /* reconstruct */
    2425     2174152 :                 for (j = 0; j < N; ++j) {
    2426     1768704 :                         asm volatile ("vpxor %ymm0,%ymm0,%ymm0");
    2427     1768704 :                         asm volatile ("vpxor %ymm1,%ymm1,%ymm1");
    2428             : 
    2429     9930976 :                         for (k = 0; k < N; ++k) {
    2430     8162272 :                                 uint8_t m = V[j * N + k];
    2431             : 
    2432     8162272 :                                 asm volatile ("vbroadcasti128 %0,%%ymm2" : : "m" (gfmulpshufb[m][0][0]));
    2433     8162272 :                                 asm volatile ("vbroadcasti128 %0,%%ymm3" : : "m" (gfmulpshufb[m][1][0]));
    2434     8162272 :                                 asm volatile ("vmovdqa %0,%%ymm4" : : "m" (pd[k*32]));
    2435     8162272 :                                 asm volatile ("vpsrlw  $4,%ymm4,%ymm5");
    2436     8162272 :                                 asm volatile ("vpand   %ymm7,%ymm4,%ymm4");
    2437     8162272 :                                 asm volatile ("vpand   %ymm7,%ymm5,%ymm5");
    2438     8162272 :                                 asm volatile ("vpshufb %ymm4,%ymm2,%ymm2");
    2439     8162272 :                                 asm volatile ("vpshufb %ymm5,%ymm3,%ymm3");
    2440     8162272 :                                 asm volatile ("vpxor   %ymm2,%ymm0,%ymm0");
    2441     8162272 :                                 asm volatile ("vpxor   %ymm3,%ymm1,%ymm1");
    2442             :                         }
    2443             : 
    2444     1768704 :                         asm volatile ("vpxor %ymm1,%ymm0,%ymm0");
    2445     1768704 :                         asm volatile ("vmovdqa %%ymm0,%0" : "=m" (pa[j][i]));
    2446             :                 }
    2447             :         }
    2448             : 
    2449             :         raid_avx_end();
    2450       17765 : }
    2451             : #endif
    2452             : 

Generated by: LCOV version 1.13