📄 fdct.c
字号:
#undef MERGE_S16 /* }}} *//* Some of the initial calculations can be done as vector short before * conversion to vector float. The following code section takes advantage * of this. */#if 1 /* fdct rows {{{ */ vs16(x0) = vec_add(vs16(b00), vs16(b70)); vs16(x7) = vec_sub(vs16(b00), vs16(b70)); vs16(x1) = vec_add(vs16(b10), vs16(b60)); vs16(x6) = vec_sub(vs16(b10), vs16(b60)); vs16(x2) = vec_add(vs16(b20), vs16(b50)); vs16(x5) = vec_sub(vs16(b20), vs16(b50)); vs16(x3) = vec_add(vs16(b30), vs16(b40)); vs16(x4) = vec_sub(vs16(b30), vs16(b40)); vs16(b70) = vec_add(vs16(x0), vs16(x3)); vs16(b10) = vec_add(vs16(x1), vs16(x2)); vs16(b00) = vec_add(vs16(b70), vs16(b10)); vs16(b40) = vec_sub(vs16(b70), vs16(b10));#define CTF0(n) \ vs32(b##n##1) = vec_unpackl(vs16(b##n##0)); \ vs32(b##n##0) = vec_unpackh(vs16(b##n##0)); \ b##n##1 = vec_ctf(vs32(b##n##1), 0); \ b##n##0 = vec_ctf(vs32(b##n##0), 0); CTF0(0); CTF0(4); vs16(b20) = vec_sub(vs16(x0), vs16(x3)); vs16(b60) = vec_sub(vs16(x1), vs16(x2)); CTF0(2); CTF0(6);#undef CTF0 x0 = vec_add(b60, b20); x1 = vec_add(b61, b21); cnst = LD_W2; x0 = vec_madd(cnst, x0, mzero); x1 = vec_madd(cnst, x1, mzero); cnst = LD_W1; b20 = vec_madd(cnst, b20, x0); b21 = vec_madd(cnst, b21, x1); cnst = LD_W0; b60 = vec_madd(cnst, b60, x0); b61 = vec_madd(cnst, b61, x1);#define CTFX(x,b) \ vs32(b##0) = vec_unpackh(vs16(x)); \ vs32(b##1) = vec_unpackl(vs16(x)); \ b##0 = vec_ctf(vs32(b##0), 0); \ b##1 = vec_ctf(vs32(b##1), 0); \ CTFX(x4, b7); CTFX(x5, b5); CTFX(x6, b3); CTFX(x7, b1);#undef CTFX x0 = vec_add(b70, b10); x1 = vec_add(b50, b30); x2 = vec_add(b70, b30); x3 = vec_add(b50, b10); x8 = vec_add(x2, x3); cnst = LD_W3; x8 = vec_madd(cnst, x8, mzero); cnst = LD_W8; x0 = vec_madd(cnst, x0, mzero); cnst = LD_W9; x1 = vec_madd(cnst, x1, mzero); cnst = LD_WA; x2 = vec_madd(cnst, x2, x8); cnst = LD_WB; x3 = vec_madd(cnst, x3, x8); cnst = LD_W4; b70 = vec_madd(cnst, b70, x0); cnst = LD_W5; b50 = vec_madd(cnst, b50, x1); cnst = LD_W6; b30 = vec_madd(cnst, b30, x1); cnst = LD_W7; b10 = vec_madd(cnst, b10, x0); b70 = vec_add(b70, x2); b50 = vec_add(b50, x3); b30 = vec_add(b30, x2); b10 = vec_add(b10, x3); x0 = vec_add(b71, b11); x1 = vec_add(b51, b31); x2 = vec_add(b71, b31); x3 = vec_add(b51, b11); x8 = vec_add(x2, x3); cnst = LD_W3; x8 = vec_madd(cnst, x8, mzero); cnst = LD_W8; x0 = vec_madd(cnst, x0, mzero); cnst = LD_W9; x1 = vec_madd(cnst, x1, mzero); cnst = LD_WA; x2 = vec_madd(cnst, x2, x8); cnst = LD_WB; x3 = vec_madd(cnst, x3, x8); cnst = LD_W4; b71 = vec_madd(cnst, b71, x0); cnst = LD_W5; b51 = vec_madd(cnst, b51, x1); cnst = LD_W6; b31 = vec_madd(cnst, b31, x1); cnst = LD_W7; b11 = vec_madd(cnst, b11, x0); b71 = vec_add(b71, x2); b51 = vec_add(b51, x3); b31 = vec_add(b31, x2); b11 = vec_add(b11, x3); /* }}} */#else /* convert to float {{{ */#define CTF(n) \ vs32(b##n##1) = vec_unpackl(vs16(b##n##0)); \ vs32(b##n##0) = vec_unpackh(vs16(b##n##0)); \ b##n##1 = vec_ctf(vs32(b##n##1), 0); \ b##n##0 = vec_ctf(vs32(b##n##0), 0); \ CTF(0); CTF(1); CTF(2); CTF(3); CTF(4); CTF(5); CTF(6); CTF(7);#undef CTF /* }}} */ FDCTROW(b00, b10, b20, b30, b40, b50, b60, b70); FDCTROW(b01, b11, b21, b31, b41, b51, b61, b71);#endif /* 8x8 matrix transpose (vector float[8][2]) {{{ */ x0 = vec_mergel(b00, b20); x1 = vec_mergeh(b00, b20); x2 = vec_mergel(b10, b30); x3 = vec_mergeh(b10, b30); b00 = vec_mergeh(x1, x3); b10 = vec_mergel(x1, x3); b20 = vec_mergeh(x0, x2); b30 = vec_mergel(x0, x2); x4 = vec_mergel(b41, b61); x5 = vec_mergeh(b41, b61); x6 = vec_mergel(b51, b71); x7 = vec_mergeh(b51, b71); b41 = vec_mergeh(x5, x7); b51 = vec_mergel(x5, x7); b61 = vec_mergeh(x4, x6); b71 = vec_mergel(x4, x6); x0 = vec_mergel(b01, b21); x1 = vec_mergeh(b01, b21); x2 = vec_mergel(b11, b31); x3 = vec_mergeh(b11, b31); x4 = vec_mergel(b40, b60); x5 = vec_mergeh(b40, b60); x6 = vec_mergel(b50, b70); x7 = vec_mergeh(b50, b70); b40 = vec_mergeh(x1, x3); b50 = vec_mergel(x1, x3); b60 = vec_mergeh(x0, x2); b70 = vec_mergel(x0, x2); b01 = vec_mergeh(x5, x7); b11 = vec_mergel(x5, x7); b21 = vec_mergeh(x4, x6); b31 = vec_mergel(x4, x6); /* }}} */ /* divby8 = (vector float)(0.125); {{{ */ vu8(divby8) = vec_splat_u8(-6); vu16(divby8) = vec_sr(vu16(divby8),vu16(divby8)); vs32(divby8) = vec_unpackh(vs16(divby8)); divby8 = vec_sld(divby8, divby8, 3); /* }}} */ cnsts0 = vec_madd(cnsts0, divby8, mzero); cnsts1 = vec_madd(cnsts1, divby8, mzero); cnsts2 = vec_madd(cnsts2, divby8, mzero); FDCTCOL(b00, b10, b20, b30, b40, b50, b60, b70); FDCTCOL(b01, b11, b21, b31, b41, b51, b61, b71); /* round, convert back to short and clip {{{ */ /* cnsts0 = max = (2047); cnsts2 = min = (-2048); {{{ */ vu8(cnsts0) = vec_splat_u8(0x7); vs16(x8) = vec_splat_s16(-1); /* 0xffff */ vu8(cnsts0) = vec_mergeh(vu8(cnsts0), vu8(x8)); /* 0x07ff == 2047 */ vs16(cnsts2) = vec_sub(vs16(x8), vs16(cnsts0)); /* }}} */#define CTS(n) \ b##n##0 = vec_round(b##n##0); \ b##n##1 = vec_round(b##n##1); \ vs32(b##n##0) = vec_cts(b##n##0, 0); \ vs32(b##n##1) = vec_cts(b##n##1, 0); \ vs16(b##n##0) = vec_pack(vs32(b##n##0), vs32(b##n##1)); \ vs16(b##n##0) = vec_min(vs16(b##n##0), vs16(cnsts0)); \ vs16(b##n##0) = vec_max(vs16(b##n##0), vs16(cnsts2)); \ vec_st(vs16(b##n##0), 0, bp); bp = (vector signed short*)block; CTS(0); bp++; CTS(1); bp++; CTS(2); bp++; CTS(3); bp++; CTS(4); bp++; CTS(5); bp++; CTS(6); bp++; CTS(7);#undef CTS /* }}} */ AMBER_STOP;}#if ALTIVEC_TEST_FUNCTION(fdct) /* {{{ */#ifdef ALTIVEC_VERIFYvoid fdct_altivec_verify(FDCT_PDECL){ int i; fdct_altivec(FDCT_ARGS); for (i = 0; i < 64; i++) { if (block[i] < -2048) mjpeg_warn("fdct: block[%d]=%d < -2048\n", i, block[i]); else if (block[i] > 2047) mjpeg_warn("fdct: block[%d]=%d > 2047\n", i, block[i]); }}#elseALTIVEC_TEST(fdct, void, (FDCT_PDECL), FDCT_PFMT, FDCT_ARGS);#endif#endif /* }}} *//* vim:set foldmethod=marker foldlevel=0: */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -