]> code.delx.au - pulseaudio/commitdiff
sbc: added "cc" to the clobber list of mmx inline assembly
authorSiarhei Siamashka <siarhei.siamashka@nokia.com>
Mon, 14 Mar 2011 18:36:07 +0000 (15:36 -0300)
committerLuiz Augusto von Dentz <luiz.dentz-von@nokia.com>
Mon, 14 Mar 2011 18:44:47 +0000 (15:44 -0300)
In the case of scale factors calculation optimizations, the inline
assembly code has instructions which update flags register, but
"cc" was not mentioned in the clobber list. When optimizing code,
gcc theoretically is allowed to do a comparison before the inline
assembly block, and a conditional branch after it which would lead
to a problem if the flags register gets clobbered. While this is
apparently not happening in practice with the current versions of
gcc, the clobber list needs to be corrected.

Regarding the other inline assembly blocks. While most likely it
is actually unnecessary based on quick review, "cc" is also added
there to the clobber list because it should have no impact on
performance in practice. It's kind of cargo cult, but relieves
us from the need to track the potential updates of flags register
in all these places.

src/modules/bluetooth/sbc/sbc_primitives_mmx.c

index d8373b3ae63ed7be8ed1ad4dc04bfcea0487ee5d..ab89d074bc59716818926d58e895b58415ae3c08 100644 (file)
@@ -100,7 +100,7 @@ static inline void sbc_analyze_four_mmx(const int16_t *in, int32_t *out,
                :
                : "r" (in), "r" (consts), "r" (&round_c), "r" (out),
                        "i" (SBC_PROTO_FIXED4_SCALE)
-               : "memory");
+               : "cc", "memory");
 }
 
 static inline void sbc_analyze_eight_mmx(const int16_t *in, int32_t *out,
@@ -242,7 +242,7 @@ static inline void sbc_analyze_eight_mmx(const int16_t *in, int32_t *out,
                :
                : "r" (in), "r" (consts), "r" (&round_c), "r" (out),
                        "i" (SBC_PROTO_FIXED8_SCALE)
-               : "memory");
+               : "cc", "memory");
 }
 
 static inline void sbc_analyze_4b_4s_mmx(int16_t *x, int32_t *out,
@@ -322,7 +322,7 @@ static void sbc_calc_scalefactors_mmx(
                                "r" (&scale_factor[ch][sb]),
                                "r" (&consts),
                                "i" (SCALE_OUT_BITS)
-                       : "memory");
+                       : "cc", "memory");
                }
        }
        asm volatile ("emms\n");