函数源码 |
Source File:lib\raid6\sse1.c |
Create Date:2022-07-27 08:07:27 |
首页 | Copyright©Brick |
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | /* * Plain SSE1 implementation */ static void raid6_sse11_gen_syndrome( int disks, size_t bytes, void **ptrs) { u8 **dptr = (u8 **)ptrs; u8 *p, *q; int d, z, z0; z0 = disks - 3; /* Highest data disk */ p = dptr[z0+1]; /* XOR parity */ q = dptr[z0+2]; /* RS syndrome */ kernel_fpu_begin(); asm volatile ( "movq %0,%%mm0" : : "m" (raid6_mmx_constants.x1d)); asm volatile ( "pxor %mm5,%mm5" ); /* Zero temp */ for ( d = 0 ; d < bytes ; d += 8 ) { asm volatile ( "prefetchnta %0" : : "m" (dptr[z0][d])); asm volatile ( "movq %0,%%mm2" : : "m" (dptr[z0][d])); /* P[0] */ asm volatile ( "prefetchnta %0" : : "m" (dptr[z0-1][d])); asm volatile ( "movq %mm2,%mm4" ); /* Q[0] */ asm volatile ( "movq %0,%%mm6" : : "m" (dptr[z0-1][d])); for ( z = z0-2 ; z >= 0 ; z-- ) { asm volatile ( "prefetchnta %0" : : "m" (dptr[z][d])); asm volatile ( "pcmpgtb %mm4,%mm5" ); asm volatile ( "paddb %mm4,%mm4" ); asm volatile ( "pand %mm0,%mm5" ); asm volatile ( "pxor %mm5,%mm4" ); asm volatile ( "pxor %mm5,%mm5" ); asm volatile ( "pxor %mm6,%mm2" ); asm volatile ( "pxor %mm6,%mm4" ); asm volatile ( "movq %0,%%mm6" : : "m" (dptr[z][d])); } asm volatile ( "pcmpgtb %mm4,%mm5" ); asm volatile ( "paddb %mm4,%mm4" ); asm volatile ( "pand %mm0,%mm5" ); asm volatile ( "pxor %mm5,%mm4" ); asm volatile ( "pxor %mm5,%mm5" ); asm volatile ( "pxor %mm6,%mm2" ); asm volatile ( "pxor %mm6,%mm4" ); asm volatile ( "movntq %%mm2,%0" : "=m" (p[d])); asm volatile ( "movntq %%mm4,%0" : "=m" (q[d])); } asm volatile ( "sfence" : : : "memory" ); kernel_fpu_end(); } |