diff options
author | Mathias 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 |
commit | b21be6054a76418e93920ae4d038f75d65ba8840 (patch) | |
tree | 0ed43cc6dd236a9c1bf8df9755fefb4017a6724b /src/helper/binarybuffer.c | |
parent | 6684b35346fc10626041e1b2fef060786bf98a95 (diff) | |
download | riscv-openocd-b21be6054a76418e93920ae4d038f75d65ba8840.zip riscv-openocd-b21be6054a76418e93920ae4d038f75d65ba8840.tar.gz riscv-openocd-b21be6054a76418e93920ae4d038f75d65ba8840.tar.bz2 |
performance: committed wrong version of buf_set_buf optimization
oops...
Signed-off-by: Øyvind Harboe <oyvind.harboe@zylin.com>
Diffstat (limited to 'src/helper/binarybuffer.c')
-rw-r--r-- | src/helper/binarybuffer.c | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c index e789e6f..5732689 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; |