Alien-FreeImage
view release on metacpan or search on metacpan
src/Source/LibJXR/image/decode/strdec_x86.c view on Meta::CPAN
movdqa xmm3, xmm0 // d = xmm3
paddd xmm0, xmm0
paddd xmm0, xmm3
psrad xmm0, 3
paddd xmm1, xmm0
movdqa xmm0, xmm1 // a = xmm0
paddd xmm1, xmm1
paddd xmm1, xmm0
psrad xmm1, 4
paddd xmm3, xmm1
movdqa xmm5, xmm0 // a
psrad xmm5, 7
paddd xmm3, xmm5 // d += (a >> 7)
psrad xmm5, 3
psubd xmm3, xmm5 // d -= (a >> 10)
movdqa xmm5, [g_const_d4]
movdqa xmm1, xmm3 // d = xmm1
psubd xmm2, xmm4
paddd xmm5, xmm3
paddd xmm3, xmm3
paddd xmm3, xmm5
psrad xmm3, 3
paddd xmm0, xmm3
movdqa xmm3, xmm2 // b = xmm3
psrad xmm2, 1
psubd xmm1, xmm2
movdqa xmm2, xmm0 // a = xmm2
psubd xmm0, xmm3
psrad xmm0, 1
psubd xmm0, xmm4 // c = xmm0
paddd xmm3, xmm1
psubd xmm2, xmm0
//================
movdqa [edi + 4 * 4], xmm1
movdqa [edi + 4 * 64], xmm0
movdqa [esi + 4 * 12], xmm2
movdqa [esi + 4 * 72], xmm3
add ebp, 8
mov [esp], ebp
jnz Loop0
//================
add esp, (4 + 4) * 16 + 4
pop edi
pop esi
pop ebx
pop ebp
ret 4 * 2
}
}
Int invTransformMacroblock_YUV444_Center5(CWMImageStrCodec * pSC)
{
const OVERLAP olOverlap = pSC->WMISCP.olOverlap;
int i = 0;
assert(0 < pSC->cRow && pSC->cRow < pSC->cmbHeight);
assert(0 < pSC->cColumn && pSC->cColumn < pSC->cmbWidth);
assert(0 == pSC->WMII.cPostProcStrength);
assert(YUV_444 == pSC->m_param.cfColorFormat);
assert(3 == pSC->m_param.cNumChannels);
assert(pSC->m_Dparam->bDecodeFullWidth);
assert(1 == pSC->m_Dparam->cThumbnailScale);
for (i = 0; i < 3; ++i)
{
PixelI* const p0 = pSC->p0MBbuffer[i];
PixelI* const p1 = pSC->p1MBbuffer[i];
//================================
// second level inverse transform
strIDCT4x4Stage2(p1);
if (pSC->m_param.bScaledArith) {
strNormalizeDec(p1, (i != 0));
}
//================================
// second level inverse overlap
if (OL_TWO <= olOverlap)
{
strPost4x4Stage2Split_alternate(p0, p1);
}
//================================
// first level inverse transform
strIDCT4x4Stage1_OPT5(p0, p1);
//================================
// first level inverse overlap
if (OL_ONE <= olOverlap)
{
strPost4x4Stage1_alternate_ASM5(p0, p1);
}
}
return ICERR_OK;
}
#endif
#endif
//================================================================
void StrDecOpt(CWMImageStrCodec* pSC)
{
#if defined(WMP_OPT_SSE2)
if (IsProcessorFeaturePresent(PF_XMMI64_INSTRUCTIONS_AVAILABLE))
{
CWMImageInfo* pII = &pSC->WMII;
// CWMIStrCodecParam* pSCP = &pSC->WMISCP;
g_const_d0 = _mm_setzero_si128();
g_const_d3 = _mm_set1_epi32(3);
g_const_d1 = _mm_set_epi32(1, 1, 1, 1);
g_const_d4 = _mm_set_epi32(4, 4, 4, 4);
g_const_d0x80 = _mm_set_epi32(0x80, 0x80, 0x80, 0x80);
g_const_w0x80 = _mm_set_epi16(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
g_const_b0x80 = _mm_set_epi8(0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
if (pSC->WMII.fPaddedUserBuffer &&
//pSC->m_Dparam->bDecodeFullFrame &&
//((pII->cWidth & 0xf) == 0) &&
//(((int) pSC->WMIBI.pv & 0xf) == 0) &&
BD_8 == pII->bdBitDepth &&
CF_RGB == pII->cfColorFormat &&
24 == pII->cBitsPerUnit &&
pII->bRGB &&
O_NONE == pII->oOrientation &&
YUV_444 == pSC->m_param.cfColorFormat &&
pSC->p1MBbuffer[1] - pSC->p1MBbuffer[0] == pSC->p1MBbuffer[2] - pSC->p1MBbuffer[1] &&
pSC->m_Dparam->bDecodeFullFrame &&
1)
{
#if defined(WMP_OPT_CC_DEC)
if (pSC->m_param.bScaledArith || pSC->WMISCP.olOverlap != OL_NONE)
{
pSC->Load = outputMBRow_RGB24_Lossy_3;
}
else
{
pSC->Load = outputMBRow_RGB24_Lossless_1;
}
#endif // WMP_OPT_CC_DEC
}
if (YUV_444 == pSC->m_param.cfColorFormat &&
pSC->p1MBbuffer[1] - pSC->p1MBbuffer[0] == pSC->p1MBbuffer[2] - pSC->p1MBbuffer[1] &&
pSC->m_Dparam->bDecodeFullWidth &&
pSC->m_param.cSubVersion == CODEC_SUBVERSION_NEWSCALING_SOFT_TILES &&
1 == pSC->m_Dparam->cThumbnailScale)
{
#if defined(WMP_OPT_TRFM_DEC)
pSC->TransformCenter = invTransformMacroblock_YUV444_Center5;
#endif
}
}
#else
UNREFERENCED_PARAMETER( pSC );
#endif
}
( run in 0.446 second using v1.01-cache-2.11-cpan-3782747c604 )