projects
/
fjl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
51c6a58
)
Add an x86 optimized version of extend().
author
Steinar H. Gunderson
<sesse@debian.org>
Mon, 1 Jun 2009 00:37:26 +0000
(
02:37
+0200)
committer
Steinar H. Gunderson
<sesse@debian.org>
Mon, 1 Jun 2009 00:37:26 +0000
(
02:37
+0200)
dehuff.h
patch
|
blob
|
history
diff --git
a/dehuff.h
b/dehuff.h
index f29b815631752e213d6a9867b728e33c9438c60d..7621f6095e99791feb6138e81c2574ae9dda6bce 100644
(file)
--- a/
dehuff.h
+++ b/
dehuff.h
@@
-83,11
+83,23
@@
static const int bit_thresholds[16] = {
static inline unsigned extend(int val, unsigned bits)
{
static inline unsigned extend(int val, unsigned bits)
{
+#if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__))
+ // GCC should ideally be able to figure out that the conditional move is better, but
+ // it doesn't for various reasons, and this is pretty important for speed, so we hardcode.
+ asm("cmp %2, %0 ; cmovl %3, %0"
+ : "=r" (val)
+ : "0" (val),
+ "g" (bit_thresholds[bits]),
+ "r" (val + (-1 << bits) + 1)
+ : "cc");
+ return val;
+#else
if (val < bit_thresholds[bits]) {
return val + (-1 << bits) + 1;
} else {
return val;
}
if (val < bit_thresholds[bits]) {
return val + (-1 << bits) + 1;
} else {
return val;
}
+#endif
}
#endif /* !defined(_DEHUFF_H) */
}
#endif /* !defined(_DEHUFF_H) */