summaryrefslogtreecommitdiff
path: root/src/helper
diff options
context:
space:
mode:
authorMathias K <kesmtp@freenet.de>2011-02-04 21:15:22 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-02-08 09:39:59 +0100
commit706284a8fd562d5a6e2c1f123f8cb366b7e49e7d (patch)
tree0f3f75dcc6cea75c71853ec716ad6b59dfb28f26 /src/helper
parent5ca7cbe2d232fcaff32598af1ef5e962e704c004 (diff)
downloadopenocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.gz
openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.bz2
openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.tar.xz
openocd+libswd-706284a8fd562d5a6e2c1f123f8cb366b7e49e7d.zip
buf_set_buf around 30% speed increase
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
Diffstat (limited to 'src/helper')
-rw-r--r--src/helper/binarybuffer.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c
index 3a16cce6..e789e6ff 100644
--- a/src/helper/binarybuffer.c
+++ b/src/helper/binarybuffer.c
@@ -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)