All of lore.kernel.org
 help / color / mirror / Atom feed
From: Peter Lieven <pl@dlhnet.de>
To: "qemu-devel@nongnu.org" <qemu-devel@nongnu.org>
Cc: Kevin Wolf <kwolf@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Orit Wasserman <owasserm@redhat.com>,
	Stefan Hajnoczi <stefanha@gmail.com>
Subject: [Qemu-devel] [RFC][PATCH 2/9] add a function to find non-zero content in a buffer
Date: Tue, 12 Mar 2013 16:48:56 +0100	[thread overview]
Message-ID: <513F4E68.2060005@dlhnet.de> (raw)

Signed-off-by: Peter Lieven <pl@kamp.de>
---
  include/qemu-common.h |    1 +
  util/cutils.c         |   30 ++++++++++++++++++++++++++++++
  2 files changed, 31 insertions(+)

diff --git a/include/qemu-common.h b/include/qemu-common.h
index a3555d0..c22c41e 100644
--- a/include/qemu-common.h
+++ b/include/qemu-common.h
@@ -362,6 +362,7 @@ size_t qemu_iovec_from_buf(QEMUIOVector *qiov, size_t offset,
  size_t qemu_iovec_memset(QEMUIOVector *qiov, size_t offset,
                           int fillc, size_t bytes);

+size_t buffer_find_nonzero_offset(const void *buf, size_t len);
  bool buffer_is_zero(const void *buf, size_t len);

  void qemu_progress_init(int enabled, float min_skip);
diff --git a/util/cutils.c b/util/cutils.c
index 1439da4..a09d8e8 100644
--- a/util/cutils.c
+++ b/util/cutils.c
@@ -143,6 +143,36 @@ int qemu_fdatasync(int fd)
  }

  /*
+ * Searches for an area with non-zero content in a buffer
+ *
+ * Attention! The len must be a multiple of 8 * sizeof(VECTYPE)
+ * and addr must bedue to restriction of optimizations in this function.
+ *
+ * The return value is the offset of the non-zero area rounded
+ * down to 8 * sizeof(VECTYPE). If the buffer is all zero
+ * the return value is equal to len.
+ */
+
+size_t buffer_find_nonzero_offset(const void *buf, size_t len)
+{
+    VECTYPE *p = (VECTYPE *)buf;
+    VECTYPE zero = ZERO_SPLAT;
+    size_t i;
+    for (i = 0; i < len / sizeof(VECTYPE); i += 8) {
+		VECTYPE tmp0 = p[i+0] | p[i+1];
+		VECTYPE tmp1 = p[i+2] | p[i+3];
+		VECTYPE tmp2 = p[i+4] | p[i+5];
+		VECTYPE tmp3 = p[i+6] | p[i+7];
+		VECTYPE tmp01 = tmp0 | tmp1;
+		VECTYPE tmp23 = tmp2 | tmp3;
+		if (!ALL_EQ(tmp01 | tmp23, zero)) {
+		    break;
+		}
+    }
+    return i * sizeof(VECTYPE);
+}
+
+/*
   * Checks if a buffer is all zeroes
   *
   * Attention! The len must be a multiple of 4 * sizeof(long) due to
-- 
1.7.9.5

             reply	other threads:[~2013-03-12 15:49 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-12 15:48 Peter Lieven [this message]
2013-03-12 15:59 ` [Qemu-devel] [RFC][PATCH 2/9] add a function to find non-zero content in a buffer Eric Blake

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=513F4E68.2060005@dlhnet.de \
    --to=pl@dlhnet.de \
    --cc=kwolf@redhat.com \
    --cc=owasserm@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=stefanha@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.