public inbox for [email protected]
 help / color / mirror / Atom feed
From: Ammar Faizi <[email protected]>
To: "Willy Tarreau" <[email protected]>, "Thomas Weißschuh" <[email protected]>
Cc: Ammar Faizi <[email protected]>,
	Nicholas Rosenberg <[email protected]>,
	Alviro Iskandar Setiawan <[email protected]>,
	Michael William Jonathan <[email protected]>,
	GNU/Weeb Mailing List <[email protected]>,
	Linux Kernel Mailing List <[email protected]>
Subject: [RFC PATCH v1 3/5] tools/nolibc: x86-64: Use `rep cmpsb` for `memcmp()`
Date: Wed, 30 Aug 2023 20:57:24 +0700	[thread overview]
Message-ID: <[email protected]> (raw)
In-Reply-To: <[email protected]>

Simplify memcmp() on the x86-64 arch.

The x86-64 arch has a 'rep cmpsb' instruction, which can be used to
implement the memcmp() function.

    %rdi = source 1
    %rsi = source 2
    %rcx = length

Signed-off-by: Ammar Faizi <[email protected]>
---
 tools/include/nolibc/arch-x86_64.h | 19 +++++++++++++++++++
 tools/include/nolibc/string.h      |  2 ++
 2 files changed, 21 insertions(+)

diff --git a/tools/include/nolibc/arch-x86_64.h b/tools/include/nolibc/arch-x86_64.h
index 42f2674ad1ecdd64..6c1b54ba9f774e7b 100644
--- a/tools/include/nolibc/arch-x86_64.h
+++ b/tools/include/nolibc/arch-x86_64.h
@@ -214,4 +214,23 @@ __asm__ (
 	"retq\n"
 );
 
+#define NOLIBC_ARCH_HAS_MEMCMP
+static int memcmp(const void *s1, const void *s2, size_t n)
+{
+	const unsigned char *p1 = s1;
+	const unsigned char *p2 = s2;
+
+	if (!n)
+		return 0;
+
+	__asm__ volatile (
+		"rep cmpsb"
+		: "+D"(p2), "+S"(p1), "+c"(n)
+		: "m"(*(const unsigned char (*)[n])s1),
+		  "m"(*(const unsigned char (*)[n])s2)
+	);
+
+	return p1[-1] - p2[-1];
+}
+
 #endif /* _NOLIBC_ARCH_X86_64_H */
diff --git a/tools/include/nolibc/string.h b/tools/include/nolibc/string.h
index 1bad6121ef8c4ab5..3c941289d5dd0985 100644
--- a/tools/include/nolibc/string.h
+++ b/tools/include/nolibc/string.h
@@ -15,6 +15,7 @@ static void *malloc(size_t len);
  * As much as possible, please keep functions alphabetically sorted.
  */
 
+#ifndef NOLIBC_ARCH_HAS_MEMCMP
 static __attribute__((unused))
 int memcmp(const void *s1, const void *s2, size_t n)
 {
@@ -26,6 +27,7 @@ int memcmp(const void *s1, const void *s2, size_t n)
 	}
 	return c1;
 }
+#endif /* #ifndef NOLIBC_ARCH_HAS_MEMCMP */
 
 static __attribute__((unused))
 void *_nolibc_memcpy_up(void *dst, const void *src, size_t len)
-- 
Ammar Faizi


  parent reply	other threads:[~2023-08-30 13:57 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-30 13:57 [RFC PATCH v1 0/5] nolibc x86-64 string functions Ammar Faizi
2023-08-30 13:57 ` [RFC PATCH v1 1/5] tools/nolibc: x86-64: Use `rep movsb` for `memcpy()` and `memmove()` Ammar Faizi
2023-08-30 13:57 ` [RFC PATCH v1 2/5] tools/nolibc: x86-64: Use `rep stosb` for `memset()` Ammar Faizi
2023-08-30 14:08   ` Alviro Iskandar Setiawan
2023-08-30 14:13     ` Ammar Faizi
2023-08-30 14:24   ` Alviro Iskandar Setiawan
2023-08-30 15:09     ` Ammar Faizi
2023-08-30 15:23       ` Willy Tarreau
2023-08-30 15:44         ` Ammar Faizi
2023-08-30 15:51           ` Willy Tarreau
2023-08-30 16:08             ` Ammar Faizi
2023-08-30 16:11               ` Alviro Iskandar Setiawan
2023-08-30 13:57 ` Ammar Faizi [this message]
2023-08-30 21:26   ` [RFC PATCH v1 3/5] tools/nolibc: x86-64: Use `rep cmpsb` for `memcmp()` Willy Tarreau
2023-09-01  3:24     ` Ammar Faizi
2023-09-01  3:35       ` Willy Tarreau
2023-09-01  7:27         ` Ammar Faizi
2023-09-04  8:26     ` David Laight
2023-08-30 13:57 ` [RFC PATCH v1 4/5] tools/nolibc: string: Remove the `_nolibc_memcpy_down()` function Ammar Faizi
2023-08-30 21:27   ` Willy Tarreau
2023-08-30 13:57 ` [RFC PATCH v1 5/5] tools/nolibc: string: Remove the `_nolibc_memcpy_up()` function Ammar Faizi
2023-08-30 21:32 ` [RFC PATCH v1 0/5] nolibc x86-64 string functions Willy Tarreau
2023-09-01 11:34 ` David Laight
2023-09-01 11:46   ` Willy Tarreau
2023-09-01 13:06     ` Ammar Faizi
2023-09-01 14:23       ` David Laight
2023-09-01 14:41         ` Ammar Faizi
2023-09-01 14:54           ` David Laight
2023-09-01 15:20             ` Ammar Faizi

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 \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    [email protected] \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox