You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2022/01/16 00:07:45 UTC
svn commit: r1897105 - /httpd/httpd/trunk/server/util.c
Author: ylavic
Date: Sun Jan 16 00:07:45 2022
New Revision: 1897105
URL: http://svn.apache.org/viewvc?rev=1897105&view=rev
Log:
util: Follow up to r1897101: Yet better ap_cstr_casecmp[n]().
This ones have a shorter prologue (-O2 still).
Dump of assembler code for function ap_cstr_casecmp:
0x0000000000049fd0 <+0>: xor %edx,%edx
0x0000000000049fd2 <+2>: lea 0x3d567(%rip),%r8 # 0x87540 <ucharmap>
0x0000000000049fd9 <+9>: nopl 0x0(%rax)
0x0000000000049fe0 <+16>: movzbl (%rdi,%rdx,1),%eax
0x0000000000049fe4 <+20>: movzbl (%rsi,%rdx,1),%ecx
0x0000000000049fe8 <+24>: add $0x1,%rdx
0x0000000000049fec <+28>: movzbl (%r8,%rax,1),%eax
0x0000000000049ff1 <+33>: movzbl (%r8,%rcx,1),%ecx
0x0000000000049ff6 <+38>: cmp %ecx,%eax
0x0000000000049ff8 <+40>: jne 0x49ffe <ap_cstr_casecmp+46>
0x0000000000049ffa <+42>: test %eax,%eax
0x0000000000049ffc <+44>: jne 0x49fe0 <ap_cstr_casecmp+16>
0x0000000000049ffe <+46>: sub %ecx,%eax
0x000000000004a000 <+48>: ret
End of assembler dump.
Modified:
httpd/httpd/trunk/server/util.c
Modified: httpd/httpd/trunk/server/util.c
URL: http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util.c?rev=1897105&r1=1897104&r2=1897105&view=diff
==============================================================================
--- httpd/httpd/trunk/server/util.c (original)
+++ httpd/httpd/trunk/server/util.c Sun Jan 16 00:07:45 2022
@@ -3539,11 +3539,12 @@ static const unsigned char ucharmap[256]
AP_DECLARE(int) ap_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 */
+ const unsigned char *u1 = (const unsigned char *)s1;
+ const unsigned char *u2 = (const unsigned char *)s2;
+ for (;;) {
+ const int c1 = ucharmap[*u1++];
+ const int c2 = ucharmap[*u2++];
+ /* Not necessary to test for !c2, this is caught by c1 == c2 */
if (c1 != c2 || !c1)
return c1 - c2;
}
@@ -3551,11 +3552,12 @@ AP_DECLARE(int) ap_cstr_casecmp(const ch
AP_DECLARE(int) ap_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 */
+ const unsigned char *u1 = (const unsigned char *)s1;
+ const unsigned char *u2 = (const unsigned char *)s2;
+ while (n--) {
+ const int c1 = ucharmap[*u1++];
+ const int c2 = ucharmap[*u2++];
+ /* Not necessary to test for !c2, this is caught by c1 == c2 */
if (c1 != c2 || !c1)
return c1 - c2;
}