|
|
@ -164,36 +164,6 @@ __asm__ volatile( |
|
|
|
); |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
|
|
|
NK: |
|
|
|
|
|
|
|
Note: looking at PARANOID: |
|
|
|
|
|
|
|
"enable all paranoid tests for rounding, overflows, etc..." |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef PARANOID |
|
|
|
|
|
|
|
if (level < -2048 || level > 2047) |
|
|
|
|
|
|
|
fprintf(stderr, "unquant error %d %d\n", i, level); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
We can suppose that result of two multiplications can't be greater than 0xFFFF |
|
|
|
|
|
|
|
i.e. is 16-bit, so we use here only PMULLW instruction and can avoid |
|
|
|
|
|
|
|
a complex multiplication. |
|
|
|
|
|
|
|
===================================================== |
|
|
|
|
|
|
|
Full formula for multiplication of 2 integer numbers |
|
|
|
|
|
|
|
which are represent as high:low words: |
|
|
|
|
|
|
|
input: value1 = high1:low1 |
|
|
|
|
|
|
|
value2 = high2:low2 |
|
|
|
|
|
|
|
output: value3 = value1*value2 |
|
|
|
|
|
|
|
value3=high3:low3 (on overflow: modulus 2^32 wrap-around) |
|
|
|
|
|
|
|
this mean that for 0x123456 * 0x123456 correct result is 0x766cb0ce4 |
|
|
|
|
|
|
|
but this algorithm will compute only 0x66cb0ce4 |
|
|
|
|
|
|
|
this limited by 16-bit size of operands |
|
|
|
|
|
|
|
--------------------------------- |
|
|
|
|
|
|
|
tlow1 = high1*low2 |
|
|
|
|
|
|
|
tlow2 = high2*low1 |
|
|
|
|
|
|
|
tlow1 = tlow1 + tlow2 |
|
|
|
|
|
|
|
high3:low3 = low1*low2 |
|
|
|
|
|
|
|
high3 += tlow1 |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
static void dct_unquantize_mpeg1_intra_mmx(MpegEncContext *s, |
|
|
|
static void dct_unquantize_mpeg1_intra_mmx(MpegEncContext *s, |
|
|
|
int16_t *block, int n, int qscale) |
|
|
|
int16_t *block, int n, int qscale) |
|
|
|
{ |
|
|
|
{ |
|
|
|