sorry, wrong file ...
diff --git a/src/helper/binarybuffer.c b/src/helper/binarybuffer.c
index 3a16cce..08e149a 100644
--- a/src/helper/binarybuffer.c
+++ b/src/helper/binarybuffer.c
@@ -133,19 +133,48 @@ void* buf_set_buf(const void *_src, unsigned src_start,
{
const uint8_t *src = _src;
uint8_t *dst = _dst;
+ 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;
+
+ 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;
+ }
- unsigned src_idx = src_start, dst_idx = dst_start;
- for (unsigned i = 0; i < len; i++)
+ /* fallback to slow bit copy */
+ for (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)
_______________________________________________
Openocd-development mailing list
[email protected]
https://lists.berlios.de/mailman/listinfo/openocd-development