summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorylavic <ylavic@13f79535-47bb-0310-9956-ffa450edef68>2022-01-16 13:18:34 +0000
committerylavic <ylavic@13f79535-47bb-0310-9956-ffa450edef68>2022-01-16 13:18:34 +0000
commitdfec7833867bb71596600e42b456a8d8904512ec (patch)
treeee620f2fa9b92ea8191e5172a3cc1e84f9e7dc06
parenta5e5af946ca447b7dfe6062ea2fb8f9de4159ff5 (diff)
downloadlibapr-dfec7833867bb71596600e42b456a8d8904512ec.tar.gz
apr_cstr: Follow up to r1897102: Yet better apr_cstr_casecmp[n]().
This ones have a shorter prologue and epilogue (-O2 still). Dump of assembler code for function apr_cstr_casecmp: 0x0000000000049fd0 <+0>: xor %edx,%edx 0x0000000000049fd2 <+2>: lea 0x3d567(%rip),%r8 # 0x87540 <ucharmap> 0x0000000000049fd9 <+9>: nopl 0x0(%rax) 0x0000000000049fe0 <+16>: movzbl (%rsi,%rdx,1),%eax 0x0000000000049fe4 <+20>: movzbl (%r8,%rax,1),%ecx 0x0000000000049fe9 <+25>: movzbl (%rdi,%rdx,1),%eax 0x0000000000049fed <+29>: add $0x1,%rdx 0x0000000000049ff1 <+33>: movzbl (%r8,%rax,1),%eax 0x0000000000049ff6 <+38>: sub %ecx,%eax 0x0000000000049ff8 <+40>: jne 0x49ffe <apr_cstr_casecmp+46> 0x0000000000049ffa <+42>: test %ecx,%ecx 0x0000000000049ffc <+44>: jne 0x49fe0 <apr_cstr_casecmp+16> 0x0000000000049ffe <+46>: ret End of assembler dump. Merge r1897121 from trunk. Submitted by: ylavic git-svn-id: https://svn.apache.org/repos/asf/apr/apr/branches/1.8.x@1897122 13f79535-47bb-0310-9956-ffa450edef68
-rw-r--r--strings/apr_cstr.c30
1 files changed, 16 insertions, 14 deletions
diff --git a/strings/apr_cstr.c b/strings/apr_cstr.c
index c211c46dd..fbd801986 100644
--- a/strings/apr_cstr.c
+++ b/strings/apr_cstr.c
@@ -282,25 +282,27 @@ static const unsigned char ucharmap[256] = {
APR_DECLARE(int) apr_cstr_casecmp(const char *s1, const char *s2)
{
- apr_size_t i = 0;
- for (;; ++i) {
- const int c1 = ucharmap[(unsigned char)s1[i]];
- const int c2 = ucharmap[(unsigned char)s2[i]];
- /* Not necessary to test for !c2, this is caught by c1 != c2 */
- if (c1 != c2 || !c1)
- return c1 - c2;
+ const unsigned char *u1 = (const unsigned char *)s1;
+ const unsigned char *u2 = (const unsigned char *)s2;
+ for (;;) {
+ const int c2 = ucharmap[*u2++];
+ const int cmp = (int)ucharmap[*u1++] - c2;
+ /* Not necessary to test for !c1, this is caught by cmp */
+ if (cmp || !c2)
+ return cmp;
}
}
APR_DECLARE(int) apr_cstr_casecmpn(const char *s1, const char *s2, apr_size_t n)
{
- apr_size_t i = 0;
- for (; i < n; ++i) {
- const int c1 = ucharmap[(unsigned char)s1[i]];
- const int c2 = ucharmap[(unsigned char)s2[i]];
- /* Not necessary to test for !c2, this is caught by c1 != c2 */
- if (c1 != c2 || !c1)
- return c1 - c2;
+ const unsigned char *u1 = (const unsigned char *)s1;
+ const unsigned char *u2 = (const unsigned char *)s2;
+ while (n--) {
+ const int c2 = ucharmap[*u2++];
+ const int cmp = (int)ucharmap[*u1++] - c2;
+ /* Not necessary to test for !c1, this is caught by cmp */
+ if (cmp || !c2)
+ return cmp;
}
return 0;
}