Module: xenomai-head
Branch: master
Commit: 3c17098157e16830d101411508310dd326214deb
URL:    
http://git.xenomai.org/?p=xenomai-head.git;a=commit;h=3c17098157e16830d101411508310dd326214deb

Author: Gilles Chanteperdrix <gilles.chanteperd...@xenomai.org>
Date:   Mon Dec 21 23:45:03 2009 +0100

arith: avoid ARM Linux do_div compile-time optimizations.

They are not critical for xnarch_init_u32frac and xnarch_init_llmulshft,
and they cause the compiler register allocation to fail.

---

 include/asm-generic/arith.h |   14 +++++++++++---
 1 files changed, 11 insertions(+), 3 deletions(-)

diff --git a/include/asm-generic/arith.h b/include/asm-generic/arith.h
index dac9ccb..416e742 100644
--- a/include/asm-generic/arith.h
+++ b/include/asm-generic/arith.h
@@ -275,9 +275,13 @@ static inline void xnarch_init_u32frac(rthal_u32frac_t 
*const f,
                                       const unsigned m,
                                       const unsigned d)
 {
+       /* Avoid clever compiler optimizations to occur when d is
+          known at compile-time. The performance of this function is
+          not critical since it is only called at init time. */
+       volatile unsigned vol_d = d;
        f->integ = m / d;
-       f->frac = __rthal_generic_div96by32(__rthal_u64fromu32(m % d, 0),
-                                           0, d, NULL);
+       f->frac = __rthal_generic_div96by32
+               (__rthal_u64fromu32(m % d, 0), 0, vol_d, NULL);
 }
 
 #ifndef rthal_nodiv_imuldiv
@@ -354,12 +358,16 @@ static inline void xnarch_init_llmulshft(const unsigned 
m_in,
                                         unsigned *m_out,
                                         unsigned *s_out)
 {
+       /* Avoid clever compiler optimizations to occur when d is
+          known at compile-time. The performance of this function is
+          not critical since it is only called at init time. */
+       volatile unsigned vol_d = d_in;
        unsigned long long mult;
 
        *s_out = 31;
        while (1) {
                mult = ((unsigned long long)m_in) << *s_out;
-               do_div(mult, d_in);
+               do_div(mult, vol_d);
                if (mult <= 0x7FFFFFFF)
                        break;
                (*s_out)--;


_______________________________________________
Xenomai-git mailing list
Xenomai-git@gna.org
https://mail.gna.org/listinfo/xenomai-git

Reply via email to