diff options
Diffstat (limited to 'libvo/rgb15to16mmx.c')
-rw-r--r-- | libvo/rgb15to16mmx.c | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/libvo/rgb15to16mmx.c b/libvo/rgb15to16mmx.c new file mode 100644 index 0000000000..bb9cb977ce --- /dev/null +++ b/libvo/rgb15to16mmx.c @@ -0,0 +1,42 @@ +// Original by Strepto/Astral +// ported to gcc & bugfixed : A'rpi + +#include <inttypes.h> +//#include "attributes.h" +#include "mmx.h" + +void rgb15to16_mmx(char* s0,char* d0,int count){ + static uint64_t mask_b = 0x001F001F001F001FLL; // 00000000 00011111 xxB + static uint64_t mask_rg = 0x7FE07FE07FE07FE0LL; // 01111111 11100000 RGx + register char* s=s0+count; + register char* d=d0+count; + register int offs=-count; + movq_m2r (mask_b, mm4); + movq_m2r (mask_rg, mm5); + while(offs<0){ + movq_m2r (*(s+offs), mm0); + movq_r2r (mm0, mm1); + + movq_m2r (*(s+8+offs), mm2); + movq_r2r (mm2, mm3); + + pand_r2r (mm4, mm0); + pand_r2r (mm5, mm1); + + psllq_i2r(1,mm1); + pand_r2r (mm4, mm2); + + pand_r2r (mm5, mm3); + por_r2r (mm1, mm0); + + psllq_i2r(1,mm3); + movq_r2m (mm0,*(d+offs)); + + por_r2r (mm3,mm2); + movq_r2m (mm2,*(d+8+offs)); + + offs+=16; + } + emms(); +} + |