1
0
Fork 0
forked from len0rd/rockbox

Fuzev2: write pixel swapping in assembly for a some speed up

Unboosted: 73 fps -> 87.5 fps

git-svn-id: svn://svn.rockbox.org/rockbox/trunk@25476 a1c6a512-1295-4272-9138-f99709370657
This commit is contained in:
Rafaël Carré 2010-04-05 05:41:51 +00:00
parent 7a90aa40c6
commit 69186f6f85

View file

@ -143,10 +143,23 @@ static void dbop_write_data(const int16_t* p_bytes, int count)
* switch to 32bit output if needed */
dbop_set_mode(32);
data = (int32_t*)p_bytes;
const unsigned int mask = 0xff00ff;
while (count > 1)
{
int pixels = *data++;
pixels = (swap16(pixels >> 16) << 16) | (swap16(pixels & 0xffff));
register unsigned int pixels = *data++;
register unsigned int tmp;
/* pixels == ABCD */
asm(
"and %[tmp], %[pixels], %[mask] \n" /* tmp = 0B0D */
"and %[pixels], %[pixels], %[mask], lsl #8\n" /* %[pixels] = A0C0 */
"mov %[pixels], %[pixels], lsr #8 \n" /* %[pixels] = 0A0C */
"orr %[pixels], %[pixels], %[tmp], lsl #8 \n" /* %[pixels] = BADC */
: [pixels]"+r"(pixels), [tmp]"=r"(tmp) /* output */
: [mask]"r"(mask) /* input */
);
DBOP_DOUT32 = pixels;
count -= 2;