This is the mail archive of the
newlib@sourceware.org
mailing list for the newlib project.
[PATCH v2] Add __pure2 to __locale_ctype_ptr(_l)
- From: Wilco Dijkstra <Wilco dot Dijkstra at arm dot com>
- To: "newlib at sourceware dot org" <newlib at sourceware dot org>
- Cc: nd <nd at arm dot com>
- Date: Tue, 31 Oct 2017 13:34:46 +0000
- Subject: [PATCH v2] Add __pure2 to __locale_ctype_ptr(_l)
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=Wilco dot Dijkstra at arm dot com;
- Nodisclaimer: True
- References: <DB6PR0801MB20531740E0DC94B02F4C510183460@DB6PR0801MB2053.eurprd08.prod.outlook.com>
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
The newlib ctype functons are extremely inefficient due to repeatedly
calling __locale_ctype_ptr for every single use of a ctype macro, even
in a tight loop. Improve this by adding the missing __pure2 attribute so
the pointer can be cached just like in GLIBC, resulting in > 2x speedup
in loops.
I haven't looked in detail at the implementation, but in general you don't
need a function call - a variable, thread-local if required, would be simpler,
even faster and cache automatically.
ChangeLog:
2017-10-31 Wilco Dijkstra <wdijkstr@arm.com>
* newlib/libc/include/ctype.h (__locale_ctype_ptr): Add __pure2.
(__locale_ctype_ptr_l): Likewise.
--
diff --git a/newlib/libc/include/ctype.h b/newlib/libc/include/ctype.h
index 06458cbda47abe1294ebe226a16981fc9f38254d..a85e157a9019132fd7f9eceba690dcde07be2f3c 100644
--- a/newlib/libc/include/ctype.h
+++ b/newlib/libc/include/ctype.h
@@ -66,7 +66,7 @@ extern int toascii_l (int __c, locale_t __l);
#define _X 0100
#define _B 0200
-const char *__locale_ctype_ptr (void);
+const char *__locale_ctype_ptr (void) __pure2;
# define __CTYPE_PTR (__locale_ctype_ptr ())
#ifndef __cplusplus
@@ -100,7 +100,7 @@ const char *__locale_ctype_ptr (void);
#endif
#if __POSIX_VISIBLE >= 200809
-const char *__locale_ctype_ptr_l (locale_t);
+const char *__locale_ctype_ptr_l (locale_t) __pure2;
#define __ctype_lookup_l(__c,__l) ((__locale_ctype_ptr_l(__l)+sizeof(""[__c]))[(int)(__c)])
#define isalpha_l(__c,__l) (__ctype_lookup_l(__c,__l)&(_U|_L))