[MPlayer-users] Work done twice: problems in libswscale assembly optimization codes
Netex
netex at 163.com
Fri Jan 5 10:04:03 CET 2007
Hi,
Today I read libswscale codes and found there are problems in #ifdef's
branching. See the code:
static inline void RENAME(rgb32to24)(const uint8_t *src,uint8_t *dst,long src_size)
{
uint8_t *dest = dst;
const uint8_t *s = src;
const uint8_t *end;
#ifdef HAVE_MMX
const uint8_t *mm_end;
#endif
end = s + src_size;
#ifdef HAVE_MMX
// ...MMX Codes...
#endif
while(s < end)
{
#ifdef WORDS_BIGENDIAN
/* RGB32 (= A,B,G,R) -> RGB24 (= R,G,B) */
s++;
dest[2] = *s++;
dest[1] = *s++;
dest[0] = *s++;
dest += 3;
#else
*dest++ = *s++;
*dest++ = *s++;
*dest++ = *s++;
s++;
#endif
}
}
If HAVE_MMX is not defined, the code equals to:
static inline void RENAME(rgb32to24)(const uint8_t *src,uint8_t *dst,long src_size)
{
uint8_t *dest = dst;
const uint8_t *s = src;
const uint8_t *end;
end = s + src_size;
while(s < end)
{
#ifdef WORDS_BIGENDIAN
/* RGB32 (= A,B,G,R) -> RGB24 (= R,G,B) */
s++;
dest[2] = *s++;
dest[1] = *s++;
dest[0] = *s++;
dest += 3;
#else
*dest++ = *s++;
*dest++ = *s++;
*dest++ = *s++;
s++;
#endif
}
}
If HAVE_MMX is defined, the code equals to:
static inline void RENAME(rgb32to24)(const uint8_t *src,uint8_t *dst,long src_size)
{
uint8_t *dest = dst;
const uint8_t *s = src;
const uint8_t *end;
const uint8_t *mm_end;
end = s + src_size;
// ...MMX Codes...
while(s < end)
{
#ifdef WORDS_BIGENDIAN
/* RGB32 (= A,B,G,R) -> RGB24 (= R,G,B) */
s++;
dest[2] = *s++;
dest[1] = *s++;
dest[0] = *s++;
dest += 3;
#else
*dest++ = *s++;
*dest++ = *s++;
*dest++ = *s++;
s++;
#endif
}
}
So the work are done *TWICE*. Am I too stupid?
--
netex at 163.com
More information about the MPlayer-users
mailing list