summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCedric Bail <cedric.bail@samsung.com>2013-04-11 11:58:22 +0900
committerCedric Bail <cedric.bail@samsung.com>2013-04-11 18:07:09 +0900
commit495088caf4f229549aee9bf9d8fe94c5cd1fba3e (patch)
treed9cf0c748630c19a56d28c0c9dc011251edfb945 /src
parent95471668789d2046f8e23a3b2fc4c7fb0bb917f9 (diff)
downloadefl-495088caf4f229549aee9bf9d8fe94c5cd1fba3e.tar.gz
eina: make eina_mempool_alignof a little bit faster.
Diffstat (limited to 'src')
-rw-r--r--src/lib/eina/eina_abi.c37
-rw-r--r--src/lib/eina/eina_inline_mempool.x32
-rw-r--r--src/lib/eina/eina_mempool.c22
-rw-r--r--src/lib/eina/eina_mempool.h2
4 files changed, 70 insertions, 23 deletions
diff --git a/src/lib/eina/eina_abi.c b/src/lib/eina/eina_abi.c
index dfd9622760..cdf0f9f450 100644
--- a/src/lib/eina/eina_abi.c
+++ b/src/lib/eina/eina_abi.c
@@ -30,3 +30,40 @@ EAPI Eina_Unicode eina_unicode_utf8_get_next(const char *buf, int *iindex)
return eina_unicode_utf8_next_get(buf, iindex);
}
+EAPI unsigned int
+eina_mempool_alignof(unsigned int size)
+{
+ unsigned int align;
+ unsigned int mask;
+
+ if (EINA_UNLIKELY(size <= 2))
+ {
+ align = 1;
+ mask = 0x1;
+ }
+ else if (EINA_UNLIKELY(size < 8))
+ {
+ align = 2;
+ mask = 0x3;
+ }
+ else
+#if __WORDSIZE == 32
+ {
+ align = 3;
+ mask = 0x7;
+ }
+#else
+ if (EINA_UNLIKELY(size < 16))
+ {
+ align = 3;
+ mask = 0x7;
+ }
+ else
+ {
+ align = 4;
+ mask = 0x15;
+ }
+#endif
+
+ return ((size >> align) + (size & mask ? 1 : 0)) << align;
+}
diff --git a/src/lib/eina/eina_inline_mempool.x b/src/lib/eina/eina_inline_mempool.x
index 40cd7d5be1..fc3dd00add 100644
--- a/src/lib/eina/eina_inline_mempool.x
+++ b/src/lib/eina/eina_inline_mempool.x
@@ -142,6 +142,38 @@ eina_mempool_free(Eina_Mempool *mp, void *element)
mp->backend.free(mp->backend_data, element);
}
+static inline unsigned int
+eina_mempool_alignof(unsigned int size)
+{
+ unsigned int align;
+
+ if (EINA_UNLIKELY(size <= 2))
+ {
+ align = 2;
+ }
+ else if (EINA_UNLIKELY(size < 8))
+ {
+ align = 4;
+ }
+ else
+#if __WORDSIZE == 32
+ {
+ align = 8;
+ }
+#else
+ if (EINA_UNLIKELY(size < 16))
+ {
+ align = 8;
+ }
+ else
+ {
+ align = 16;
+ }
+#endif
+
+ return ((size / align) + (size % align ? 1 : 0)) * align;
+}
+
/**
* @}
*/
diff --git a/src/lib/eina/eina_mempool.c b/src/lib/eina/eina_mempool.c
index 46ea7f5312..55723a48c7 100644
--- a/src/lib/eina/eina_mempool.c
+++ b/src/lib/eina/eina_mempool.c
@@ -323,25 +323,3 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp)
mp->backend.statistics(mp->backend_data);
}
-EAPI unsigned int
-eina_mempool_alignof(unsigned int size)
-{
- int align;
-
- if (size <= 2)
- align = 2;
- else if (size < 8)
- align = 4;
- else
-#if __WORDSIZE == 32
- align = 8;
-
-#else
- if (size < 16)
- align = 8;
- else
- align = 16;
-#endif
-
- return ((size / align) + (size % align ? 1 : 0)) * align;
-}
diff --git a/src/lib/eina/eina_mempool.h b/src/lib/eina/eina_mempool.h
index 5ece88dd93..2dd4787972 100644
--- a/src/lib/eina/eina_mempool.h
+++ b/src/lib/eina/eina_mempool.h
@@ -94,7 +94,7 @@ EAPI void eina_mempool_statistics(Eina_Mempool *mp) EINA_ARG_NONNULL(1
EAPI Eina_Bool eina_mempool_register(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1);
EAPI void eina_mempool_unregister(Eina_Mempool_Backend *be) EINA_ARG_NONNULL(1);
-EAPI unsigned int eina_mempool_alignof(unsigned int size);
+static inline unsigned int eina_mempool_alignof(unsigned int size);
#include "eina_inline_mempool.x"