<div style="line-height:1.7;color:#000000;font-size:14px;font-family:arial"><p>On Fri, Mar 21, 2014 at 8:01 PM, chen <chenm003@163.com> wrote:<br>At 2014-03-21 13:35:31,murugan@multicorewareinc.com wrote:<br>># HG changeset patch<br>># User Murugan Vairavel <murugan@multicorewareinc.com><br>># Date 1395379456 -19800<br>>#      Fri Mar 21 10:54:16 2014 +0530<br>># Node ID 29728f7728591116192575d411ef2db2dff49c18<br>># Parent  435e50b2b92c83e10fdb2bd86bc8e8df91b7338b<br>>asm: code for input pixel upShift/downShift<br>><br>>+; Input 10bpp, Output 8bpp, width is multiple of 16<br>>+;------------------------------------------------------------------------------------------------------------------------<br>>+;void planecopy_sp(uint16_t *src, intptr_t srcStride, pixel *dst, intptr_t dstStride, int width, int height, int shift, uint16_t mask)<br>>+;------------------------------------------------------------------------------------------------------------------------<br>>+INIT_XMM sse2<br>>+cglobal downShift_10, 7,7,3<br>>+    movd        m0, r6d        ; m0 = shift<br>>+    add         r1, r1<br>>+    dec         r5d>+.loopH:><br>>+    xor         r6, r6<br>tip: r6 is a offset, when you do prepare 'r1=r1-r4', you may direct operator on r0But the pixels processed in each row is not equal to the width(r4), in case the width is not a multiple of 16. If i do it as above then the output mismatch will occur. Your algorithm do a loop that width multiple of 16 except last one, you need not to modify this part now, just for you information. <br>>+.loopW:<br>>+    movu        m1, [r0 + r6 * 2]<br>>+    movu        m2, [r0 + r6 * 2 + 16]<br>>+    psrlw       m1, m0<br>>+    psrlw       m2, m0<br>>+    packuswb    m1, m2<br>>+    movu        [r2 + r6], m1<br>>+<br>>+    add         r6, 16<br>>+    cmp         r6d, r4d<br>>+    jl          .loopW<br>>+<br>>+    ; move to next row<br>>+    lea         r0, [r0 + r1]<br>>+    lea         r2, [r2 + r3]<br>add r0,r1<br>add r2,r3I will modify that. <br><br>>+    dec         r5d<br>>+    jnz         .loopH<br>>+<br>>+;processing last row of every frame [To handle width which not a multiple of 16]<br>>+<br>>+.loop16:<br>>+    movu        m1, [r0]<br>>+    movu        m2, [r0 + 16]<br>>+    psrlw       m1, m0<br>>+    psrlw       m2, m0<br>>+    packuswb    m1, m2<br>>+    movu        [r2], m1<br>>+<br>>+    add         r0, 2 * mmsize<br>>+    add         r2, mmsize<br>>+    sub         r4d, 16<br>>+    jz          .end<br>>+    cmp         r4d, 15<br>>+    jg          .loop16<br><br>--> (X > 16) && (X >15) ??</p><p>means??</p><p> </p><p> r4d = X</p><p>sub r4d,16  & cmp  & jz   -> (X-16 == 0)</p><p>cmp r4d, 15  & jg -> (X-16 > 15)      <--- here logic a little problem, it's right but reduce, when it is true, means (x-16>=16)  -_-!</p><p>>+    cmp         r4d, 8<br>>+    jl          .process4<br>>+    movu        m1, [r0]<br>>+    psrlw       m1, m0<br>>+    packuswb    m1, m1<br>>+    movh        [r2], m1<br>>+<br>>+    add         r0, mmsize<br>>+    add         r2, 8<br>>+    sub         r4d, 8<br>>+    jz          .end<br>>+<br>>+.process4:<br>>+    cmp         r4d, 4<br>>+    jl          .process2<br>>+    movh        m1,[r0]<br>>+    psrlw       m1, m0<br>>+    packuswb    m1, m1<br>>+    movd        [r2], m1<br>>+<br>>+    add         r0, 8<br>>+    add         r2, 4<br>>+    sub         r4d, 4<br>>+    jz          .end<br>>+<br>>+.process2:<br>>+    cmp         r4d, 2<br>>+    jl          .process1<br>>+    movd        m1, [r0]<br>>+    psrlw       m1, m0<br>>+    packuswb    m1, m1<br>>+    movd        r6, m1<br>>+    mov         [r2], r6w<br>>+<br>>+    add         r0, 4<br>>+    add         r2, 2<br>>+    sub         r4d, 2<br>>+    jz          .end<br>>+<br>>+.process1:<br>>+    movd        m1, [r0]<br>>+    psrlw       m1, m0<br>>+    packuswb    m1, m1<br>>+    movd        r6, m1<br>>+    mov         [r2], r6b<br>>+.end:<br>>+    RET<br><br>(4, 2, 1) pixels path may share calculate code</p><p>Do you mean defining a macro for that?? </p><p> </p><p>No, last 16 or 8 pixel may cover all of case (result in different part in register), so we need not to calculate many times.</p></div>