summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMathias K <kesmtp@freenet.de>2011-02-08 11:06:56 +0100
committerØyvind Harboe <oyvind.harboe@zylin.com>2011-02-08 11:06:56 +0100
commitb21be6054a76418e93920ae4d038f75d65ba8840 (patch)
tree0ed43cc6dd236a9c1bf8df9755fefb4017a6724b
parent6684b35346fc10626041e1b2fef060786bf98a95 (diff)
downloadopenocd_libswd-b21be6054a76418e93920ae4d038f75d65ba8840.tar.gz
openocd_libswd-b21be6054a76418e93920ae4d038f75d65ba8840.tar.bz2
openocd_libswd-b21be6054a76418e93920ae4d038f75d65ba8840.tar.xz
openocd_libswd-b21be6054a76418e93920ae4d038f75d65ba8840.zip
performance: committed wrong version of buf_set_buf optimization
oops... Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
-rw-r--r--src/helper/binarybuffer.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c
index e789e6ff..5732689c 100644
--- a/src/helper/binarybuffer.c
+++ b/src/helper/binarybuffer.c
@@ -133,26 +133,40 @@ void* buf_set_buf(const void *_src, unsigned src_start,
{
const uint8_t *src = _src;
uint8_t *dst = _dst;
- unsigned sb,db,sq,dq;
+ unsigned i,sb,db,sq,dq, lb,lq;
sb = src_start / 8;
db = dst_start / 8;
sq = src_start % 8;
dq = dst_start % 8;
+ lb = len / 8;
+ lq = len % 8;
- for (unsigned i = 0; i < len; i++)
+ src += sb;
+ dst += db;
+
+ /* check if both buffers are on byte boundary and
+ * len is a multiple of 8bit so we can simple copy
+ * the buffer */
+ if ( (sq == 0) && (dq == 0) && (lq == 0) )
+ {
+ for (i = 0; i < lb; i++)
+ *dst++ = *src++;
+ return (uint8_t*)_dst;
+ }
+
+ /* fallback to slow bit copy */
+ for (i = 0; i < len; i++)
{
if (((*src >> (sq&7)) & 1) == 1)
*dst |= 1 << (dq&7);
else
*dst &= ~(1 << (dq&7));
-
if ( sq++ == 7 )
{
sq = 0;
src++;
}
-
if ( dq++ == 7 )
{
dq = 0;