]> git.sur5r.net Git - openocd/commitdiff
buf_set_buf around 30% speed increase
authorMathias K <kesmtp@freenet.de>
Fri, 4 Feb 2011 20:15:22 +0000 (21:15 +0100)
committerØyvind Harboe <oyvind.harboe@zylin.com>
Tue, 8 Feb 2011 08:39:59 +0000 (09:39 +0100)
Also i have checked the input of this function and in many cases
a simple byte copy is possible.

I have added this check now and is it possible the buffer is
copied byte by byte and not bit by bit.

With byte boundary input the test looks like this:

buf_set_buf 0x02000000 iteration test:
runtime (seconds): old: 6.828559 new: 0.436191 diff: 6.392368
runtime (seconds): old: 6.853636 new: 0.430389 diff: 6.423247
runtime (seconds): old: 6.794985 new: 0.423065 diff: 6.371920

Without:

buf_set_buf 0x02000000 iteration test:
runtime (seconds): old: 6.370869 new: 5.552624 diff: 0.818245
runtime (seconds): old: 6.420730 new: 5.665887 diff: 0.754843
runtime (seconds): old: 6.583306 new: 5.599021 diff: 0.984285

Regards,

Mathias

src/helper/binarybuffer.c

index 3a16cce69bb2b7f66bac21cbd5ce2ebd5fbbeca7..e789e6ff1b52a1c0282c124483f163dd62dd8d83 100644 (file)
@@ -133,19 +133,34 @@ void* buf_set_buf(const void *_src, unsigned src_start,
 {
        const uint8_t *src = _src;
        uint8_t *dst = _dst;
+       unsigned  sb,db,sq,dq;
+
+       sb = src_start / 8;
+       db = dst_start / 8;
+       sq = src_start % 8;
+       dq = dst_start % 8;
 
-       unsigned src_idx = src_start, dst_idx = dst_start;
        for (unsigned i = 0; i < len; i++)
        {
-               if (((src[src_idx / 8] >> (src_idx % 8)) & 1) == 1)
-                       dst[dst_idx / 8] |= 1 << (dst_idx % 8);
+               if (((*src >> (sq&7)) & 1) == 1)
+                       *dst |= 1 << (dq&7);
                else
-                       dst[dst_idx / 8] &= ~(1 << (dst_idx % 8));
-               dst_idx++;
-               src_idx++;
+                       *dst &= ~(1 << (dq&7));
+
+               if ( sq++ == 7 )
+               {
+                       sq = 0;
+                       src++;
+               }
+
+               if ( dq++ == 7 )
+               {
+                       dq = 0;
+                       dst++;
+               }
        }
 
-       return dst;
+       return (uint8_t*)_dst;
 }
 
 uint32_t flip_u32(uint32_t value, unsigned int num)