#ifdef CPU_COLDFIRE static void clip_block_to_dest(int16_t * block, uint8_t * dest,const int stride) { asm volatile( "move.l %[dest],%%a0 \n\t" /* init loop for i=0 to 7 */ "move.l #8,%%d1 \n\t" "clr.l %%d0 \n\t" "clr.l %%d3 \n\t" "foradd: \n\t" "movem.l (%[block]),%%d4-%%d7 \n\t" /* dot 2*/ "move.w %%d4,%%d3 \n\t" "cmp.l #255,%%d3 \n\t" "bls.b 2f \n\t" "spl.b %%d3 \n\t" "2 : \n\t" /* dot 1*/ "swap.w %%d4 \n\t" "move.w %%d4,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" /* overflow? */ "bls.b 1f \n\t" /* no: return value */ "spl.b %%d0 \n\t" /* yes: set low byte to appropriate boundary */ "1 : \n\t" /* save dot 1*/ "move.b %%d0,%%d2 \n\t" /* save dot 2*/ "lsl.l #8,%%d2 \n\t" "move.b %%d3,%%d2 \n\t" /* dot 4*/ "move.w %%d5,%%d3 \n\t" "cmp.l #255,%%d3 \n\t" "bls.b 4f \n\t" "spl.b %%d3 \n\t" "4 : \n\t" /* dot 3*/ "swap.w %%d5 \n\t" "move.w %%d5,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" /* overflow? */ "bls.b 3f \n\t" /* no: return value */ "spl.b %%d0 \n\t" /* yes: set low byte to appropriate boundary */ "3 : \n\t" /* save dot 3*/ "lsl.l #8,%%d2 \n\t" "move.b %%d0,%%d2 \n\t" /* save dot 4*/ "lsl.l #8,%%d2 \n\t" "move.b %%d3,%%d2 \n\t" /* writes 4 bytes */ "move.l %%d2,(%%a0) \n\t" /* dot 6 */ "move.w %%d6,%%d3 \n\t" "cmp.l #255,%%d3 \n\t" "bls.b 6f \n\t" "spl.b %%d3 \n\t" "6 : \n\t" /* dot 5 */ "swap.w %%d6 \n\t" "move.w %%d6,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 5f \n\t" "spl.b %%d0 \n\t" "5 : \n\t" /* save dot 5*/ "move.b %%d0,%%d2 \n\t" /* save dot 6*/ "lsl.l #8,%%d2 \n\t" "move.b %%d3,%%d2 \n\t" /* dot 8*/ "move.w %%d7,%%d3 \n\t" "cmp.l #255,%%d3 \n\t" "bls.b 8f \n\t" "spl.b %%d3 \n\t" "8 : \n\t" /* dot 7*/ "swap.w %%d7 \n\t" "move.w %%d7,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 7f \n\t" "spl.b %%d0 \n\t" "7 : \n\t" /* save dot 7*/ "lsl.l #8,%%d2 \n\t" "move.b %%d0,%%d2 \n\t" /* save dot 8*/ "lsl.l #8,%%d2 \n\t" "move.b %%d3,%%d2 \n\t" /* write to dest */ "move.l %%d2,(4,%%a0) \n\t" /* clear row, address +16 */ "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" /* next line, address +stride */ "add.l %[stride],%%a0 \n\t" "sub.l #1,%%d1 \n\t" "bne foradd \n\t" /* for end */ "sub.l #128,%[block] \n\t" : : [block]"a"(block),[dest]"a"(dest),[stride]"a"(stride) : "%a0","%d0","%d1","%d2","%d3","%d4","%d5","%d6","%d7" ); } #endif #ifdef CPU_COLDFIRE static void clip_block_to_dest_add(int16_t * block, uint8_t * dest,const int stride) { asm volatile ( "move.l %[dest],%%a0 \n\t" /* init loop for i=0 to 7 */ "move.l #8,%%d1 \n\t" "clr.l %%d2 \n\t" "foradd2: \n\t" "movem.l (%%a0),%%d4-%%d5 \n\t" "movem.l (%[block]),%%d6-%%d7/%%a1-%%a2 \n\t" /* dot 4 */ "move.w %%d7,%%d0 \n\t" "ext.l %%d0 \n\t" "move.b %%d4,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 4f \n\t" "spl.b %%d0 \n\t" "4 : \n\t" "move.b %%d0,%%d3 \n\t" /* dot 3 */ "swap.w %%d7 \n\t" "ext.l %%d7 \n\t" "lsr.l #8,%%d4 \n\t" "move.b %%d4,%%d2 \n\t" "add.l %%d2,%%d7 \n\t" "cmp.l #255,%%d7 \n\t" "bls.b 3f \n\t" "spl.b %%d7 \n\t" "3 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d7,%%d3 \n\t" /* dot 2 */ "move.w %%d6,%%d0 \n\t" "ext.l %%d0 \n\t" "lsr.l #8,%%d4 \n\t" "move.b %%d4,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 2f \n\t" "spl.b %%d0 \n\t" "2 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d0,%%d3 \n\t" /* dot 1 */ "swap.w %%d6 \n\t" "ext.l %%d6 \n\t" "lsr.l #8,%%d4 \n\t" "move.b %%d4,%%d2 \n\t" "add.l %%d2,%%d6 \n\t" "cmp.l #255,%%d6 \n\t" "bls.b 1f \n\t" "spl.b %%d6 \n\t" "1 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d6,%%d3 \n\t" "move.l #0x00FF00FF,%%d7 \n\t" /* val = ABCD */ "and.l %%d3,%%d7 \n\t" /* mask = .B.D */ "eor.l %%d7,%%d3 \n\t" /* val = A.C. */ "lsl.l #8,%%d7 \n\t" /* mask = B.D. */ "lsr.l #8,%%d3 \n\t" /* val = .A.C */ "or.l %%d7,%%d3 \n\t" /* val = BADC */ "swap %%d3 \n\t" /* val = DCBA */ /* writes 4 bytes */ "move.l %%d3,(%%a0) \n\t" /* dot 8 */ "move.l %%a2,%%d0 \n\t" "ext.l %%d0 \n\t" "move.b %%d5,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 8f \n\t" "spl.b %%d0 \n\t" "8 : \n\t" "move.b %%d0,%%d3 \n\t" /* dot 7 */ "move.l %%a2,%%d0 \n\t" "swap %%d0 \n\t" "ext.l %%d0 \n\t" "lsr.l #8,%%d5 \n\t" "move.b %%d5,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 7f \n\t" "spl.b %%d0 \n\t" "7 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d0,%%d3 \n\t" /* dot 6 */ "move.l %%a1,%%d0 \n\t" "ext.l %%d0 \n\t" "lsr.l #8,%%d5 \n\t" "move.b %%d5,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 6f \n\t" "spl.b %%d0 \n\t" "6 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d0,%%d3 \n\t" /* dot 5 */ "move.l %%a1,%%d0 \n\t" "swap %%d0 \n\t" "ext.l %%d0 \n\t" "lsr.l #8,%%d5 \n\t" "move.b %%d5,%%d2 \n\t" "add.l %%d2,%%d0 \n\t" "cmp.l #255,%%d0 \n\t" "bls.b 5f \n\t" "spl.b %%d0 \n\t" "5 : \n\t" "lsl.l #8,%%d3 \n\t" "move.b %%d0,%%d3 \n\t" "move.l #0x00FF00FF,%%d7 \n\t" /* val = ABCD */ "and.l %%d3,%%d7 \n\t" /* mask = .B.D */ "eor.l %%d7,%%d3 \n\t" /* val = A.C. */ "lsl.l #8,%%d7 \n\t" /* mask = B.D. */ "lsr.l #8,%%d3 \n\t" /* val = .A.C */ "or.l %%d7,%%d3 \n\t" /* val = BADC */ "swap %%d3 \n\t" /* val = DCBA */ /* writes 4 bytes */ "move.l %%d3,(4,%%a0) \n\t" /* clear row, address +16 */ "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" "move.l #0,(%[block])+ \n\t" /* next line, address +stride */ "add.l %[stride],%%a0 \n\t" "sub.l #1,%%d1 \n\t" "bne foradd2 \n\t" /* for end */ "sub.l #128,%[block] \n\t" : : [block]"a"(block),[dest]"a"(dest),[stride]"a"(stride) : "%a0","%a1","%a2","%d0","%d1","%d2","%d3","%d4","%d5","%d6","%d7" ); } #endif