Ignore:
Timestamp:
10/06/06 17:14:05 (18 years ago)
Author:
zorg
Message:

Separated public interface from private headers
Use opaque objects whenever possible
Some (useless?) cosmetics on libmpcdec
Remove sv5-6 outdated support
Added libwavformat for upcoming mpcdec
New layout
Work in progress...

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libmpcdec/branches/zorg/src/synth_filter.c

    r10 r68  
    3232  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    3333*/
    34 
    3534/// \file synth_filter.c
    3635/// Synthesis functions.
    3736/// \todo document me
    38 
     37#include <string.h>
    3938#include <mpcdec/mpcdec.h>
    40 #include <mpcdec/internal.h>
     39#include "decoder.h"
     40#include "math.h"
    4141
    4242/* C O N S T A N T S */
     43#define MPC_FIXED_POINT_SYNTH_FIX 2
     44
    4345#undef _
    44 
    45 #define MPC_FIXED_POINT_SYNTH_FIX 2
    46 
    4746#ifdef MPC_FIXED_POINT
    4847#define _(value)  MPC_MAKE_FRACT_CONST((double)value/(double)(0x40000))
     
    8988#undef  _
    9089
    91 static void Calculate_New_V ( const MPC_SAMPLE_FORMAT * Sample, MPC_SAMPLE_FORMAT * V )
     90static void
     91mpc_compute_new_V(const MPC_SAMPLE_FORMAT* p_sample, MPC_SAMPLE_FORMAT* pV)
    9292{
    9393    // Calculating new V-buffer values for left channel
    9494    // calculate new V-values (ISO-11172-3, p. 39)
    9595    // based upon fast-MDCT algorithm by Byeong Gi Lee
    96     /*static*/ MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15;
    97     /*static*/ MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15;
     96    MPC_SAMPLE_FORMAT A00, A01, A02, A03, A04, A05, A06, A07, A08, A09, A10, A11, A12, A13, A14, A15;
     97    MPC_SAMPLE_FORMAT B00, B01, B02, B03, B04, B05, B06, B07, B08, B09, B10, B11, B12, B13, B14, B15;
    9898    MPC_SAMPLE_FORMAT tmp;
    9999
    100     A00 = Sample[ 0] + Sample[31];
    101     A01 = Sample[ 1] + Sample[30];
    102     A02 = Sample[ 2] + Sample[29];
    103     A03 = Sample[ 3] + Sample[28];
    104     A04 = Sample[ 4] + Sample[27];
    105     A05 = Sample[ 5] + Sample[26];
    106     A06 = Sample[ 6] + Sample[25];
    107     A07 = Sample[ 7] + Sample[24];
    108     A08 = Sample[ 8] + Sample[23];
    109     A09 = Sample[ 9] + Sample[22];
    110     A10 = Sample[10] + Sample[21];
    111     A11 = Sample[11] + Sample[20];
    112     A12 = Sample[12] + Sample[19];
    113     A13 = Sample[13] + Sample[18];
    114     A14 = Sample[14] + Sample[17];
    115     A15 = Sample[15] + Sample[16];
     100    A00 = p_sample[ 0] + p_sample[31];
     101    A01 = p_sample[ 1] + p_sample[30];
     102    A02 = p_sample[ 2] + p_sample[29];
     103    A03 = p_sample[ 3] + p_sample[28];
     104    A04 = p_sample[ 4] + p_sample[27];
     105    A05 = p_sample[ 5] + p_sample[26];
     106    A06 = p_sample[ 6] + p_sample[25];
     107    A07 = p_sample[ 7] + p_sample[24];
     108    A08 = p_sample[ 8] + p_sample[23];
     109    A09 = p_sample[ 9] + p_sample[22];
     110    A10 = p_sample[10] + p_sample[21];
     111    A11 = p_sample[11] + p_sample[20];
     112    A12 = p_sample[12] + p_sample[19];
     113    A13 = p_sample[13] + p_sample[18];
     114    A14 = p_sample[14] + p_sample[17];
     115    A15 = p_sample[15] + p_sample[16];
    116116
    117117    B00 = A00 + A15;
     
    183183    A15 = MPC_MULTIPLY_FRACT_CONST_FIX((B14 - B15) , 0.7071067691f , 1);
    184184
    185     V[48] = -A00;
    186     V[ 0] =  A01;
    187     V[40] = -A02 - (V[ 8] = A03);
    188     V[36] = -((V[ 4] = A05 + (V[12] = A07)) + A06);
    189     V[44] = - A04 - A06 - A07;
    190     V[ 6] = (V[10] = A11 + (V[14] = A15)) + A13;
    191     V[38] = (V[34] = -(V[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11;
    192     V[46] = (tmp = -(A12 + A14 + A15)) - A08;
    193     V[42] = tmp - A10 - A11;
    194 
    195     A00 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 0] - Sample[31]) , 0.5006030202f ,     MPC_FIXED_POINT_SYNTH_FIX);
    196     A01 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 1] - Sample[30]) , 0.5054709315f ,     MPC_FIXED_POINT_SYNTH_FIX);
    197     A02 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 2] - Sample[29]) , 0.5154473186f ,     MPC_FIXED_POINT_SYNTH_FIX);
    198     A03 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 3] - Sample[28]) , 0.5310425758f ,     MPC_FIXED_POINT_SYNTH_FIX);
    199     A04 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 4] - Sample[27]) , 0.5531039238f ,     MPC_FIXED_POINT_SYNTH_FIX);
    200     A05 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 5] - Sample[26]) , 0.5829349756f ,     MPC_FIXED_POINT_SYNTH_FIX);
    201     A06 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 6] - Sample[25]) , 0.6225041151f ,     MPC_FIXED_POINT_SYNTH_FIX);
    202     A07 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 7] - Sample[24]) , 0.6748083234f ,     MPC_FIXED_POINT_SYNTH_FIX);
    203     A08 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 8] - Sample[23]) , 0.7445362806f ,     MPC_FIXED_POINT_SYNTH_FIX);
    204     A09 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[ 9] - Sample[22]) , 0.8393496275f ,     MPC_FIXED_POINT_SYNTH_FIX);
    205     A10 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[10] - Sample[21]) , 0.9725682139f ,     MPC_FIXED_POINT_SYNTH_FIX);
     185    pV[48] = -A00;
     186    pV[ 0] =  A01;
     187    pV[40] = -A02 - (pV[ 8] = A03);
     188    pV[36] = -((pV[ 4] = A05 + (pV[12] = A07)) + A06);
     189    pV[44] = - A04 - A06 - A07;
     190    pV[ 6] = (pV[10] = A11 + (pV[14] = A15)) + A13;
     191    pV[38] = (pV[34] = -(pV[ 2] = A09 + A13 + A15) - A14) + A09 - A10 - A11;
     192    pV[46] = (tmp = -(A12 + A14 + A15)) - A08;
     193    pV[42] = tmp - A10 - A11;
     194
     195    A00 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 0] - p_sample[31]) , 0.5006030202f ,     MPC_FIXED_POINT_SYNTH_FIX);
     196    A01 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 1] - p_sample[30]) , 0.5054709315f ,     MPC_FIXED_POINT_SYNTH_FIX);
     197    A02 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 2] - p_sample[29]) , 0.5154473186f ,     MPC_FIXED_POINT_SYNTH_FIX);
     198    A03 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 3] - p_sample[28]) , 0.5310425758f ,     MPC_FIXED_POINT_SYNTH_FIX);
     199    A04 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 4] - p_sample[27]) , 0.5531039238f ,     MPC_FIXED_POINT_SYNTH_FIX);
     200    A05 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 5] - p_sample[26]) , 0.5829349756f ,     MPC_FIXED_POINT_SYNTH_FIX);
     201    A06 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 6] - p_sample[25]) , 0.6225041151f ,     MPC_FIXED_POINT_SYNTH_FIX);
     202    A07 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 7] - p_sample[24]) , 0.6748083234f ,     MPC_FIXED_POINT_SYNTH_FIX);
     203    A08 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 8] - p_sample[23]) , 0.7445362806f ,     MPC_FIXED_POINT_SYNTH_FIX);
     204    A09 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[ 9] - p_sample[22]) , 0.8393496275f ,     MPC_FIXED_POINT_SYNTH_FIX);
     205    A10 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[10] - p_sample[21]) , 0.9725682139f ,     MPC_FIXED_POINT_SYNTH_FIX);
    206206#if MPC_FIXED_POINT_SYNTH_FIX>=2
    207     A11 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[11] - Sample[20]) , 1.1694399118f ,     MPC_FIXED_POINT_SYNTH_FIX);
    208     A12 = MPC_MULTIPLY_FRACT_CONST_SHR((Sample[12] - Sample[19]) , 1.4841645956f ,     MPC_FIXED_POINT_SYNTH_FIX);
     207    A11 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[11] - p_sample[20]) , 1.1694399118f ,     MPC_FIXED_POINT_SYNTH_FIX);
     208    A12 = MPC_MULTIPLY_FRACT_CONST_SHR((p_sample[12] - p_sample[19]) , 1.4841645956f ,     MPC_FIXED_POINT_SYNTH_FIX);
    209209#else
    210     A11 = MPC_SCALE_CONST_SHR         ((Sample[11] - Sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX);
    211     A12 = MPC_SCALE_CONST_SHR         ((Sample[12] - Sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX);
     210    A11 = MPC_SCALE_CONST_SHR         ((p_sample[11] - p_sample[20]) , 1.1694399118f , 30, MPC_FIXED_POINT_SYNTH_FIX);
     211    A12 = MPC_SCALE_CONST_SHR         ((p_sample[12] - p_sample[19]) , 1.4841645956f , 30, MPC_FIXED_POINT_SYNTH_FIX);
    212212#endif
    213     A13 = MPC_SCALE_CONST_SHR         ((Sample[13] - Sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX);
    214     A14 = MPC_SCALE_CONST_SHR         ((Sample[14] - Sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX);
    215     A15 = MPC_SCALE_CONST_SHR         ((Sample[15] - Sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX);
     213    A13 = MPC_SCALE_CONST_SHR         ((p_sample[13] - p_sample[18]) , 2.0577809811f , 29, MPC_FIXED_POINT_SYNTH_FIX);
     214    A14 = MPC_SCALE_CONST_SHR         ((p_sample[14] - p_sample[17]) , 3.4076085091f , 29, MPC_FIXED_POINT_SYNTH_FIX);
     215    A15 = MPC_SCALE_CONST_SHR         ((p_sample[15] - p_sample[16]) , 10.1900081635f, 27 ,MPC_FIXED_POINT_SYNTH_FIX);
    216216
    217217    B00 =  A00 + A15;
     
    284284
    285285    // mehrfach verwendete Ausdrücke: A04+A06+A07, A09+A13+A15
    286     V[ 5] = (V[11] = (V[13] = A07 + (V[15] = A15)) + A11) + A05 + A13;
    287     V[ 7] = (V[ 9] = A03 + A11 + A15) + A13;
    288     V[33] = -(V[ 1] = A01 + A09 + A13 + A15) - A14;
    289     V[35] = -(V[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14;
    290     V[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07;
    291     V[39] = tmp - A02 - A03;                      // abhängig vom Befehl drüber
    292     V[41] = (tmp += A13 - A12) - A02 - A03;       // abhängig vom Befehl 2 drüber
    293     V[43] = tmp - A04 - A06 - A07;                // abhängig von Befehlen 1 und 3 drüber
    294     V[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00;
    295     V[45] = tmp - A04 - A06 - A07;                // abhängig vom Befehl drüber
    296 
    297     V[32] = -V[ 0];
    298     V[31] = -V[ 1];
    299     V[30] = -V[ 2];
    300     V[29] = -V[ 3];
    301     V[28] = -V[ 4];
    302     V[27] = -V[ 5];
    303     V[26] = -V[ 6];
    304     V[25] = -V[ 7];
    305     V[24] = -V[ 8];
    306     V[23] = -V[ 9];
    307     V[22] = -V[10];
    308     V[21] = -V[11];
    309     V[20] = -V[12];
    310     V[19] = -V[13];
    311     V[18] = -V[14];
    312     V[17] = -V[15];
    313 
    314     V[63] =  V[33];
    315     V[62] =  V[34];
    316     V[61] =  V[35];
    317     V[60] =  V[36];
    318     V[59] =  V[37];
    319     V[58] =  V[38];
    320     V[57] =  V[39];
    321     V[56] =  V[40];
    322     V[55] =  V[41];
    323     V[54] =  V[42];
    324     V[53] =  V[43];
    325     V[52] =  V[44];
    326     V[51] =  V[45];
    327     V[50] =  V[46];
    328     V[49] =  V[47];
     286    pV[ 5] = (pV[11] = (pV[13] = A07 + (pV[15] = A15)) + A11) + A05 + A13;
     287    pV[ 7] = (pV[ 9] = A03 + A11 + A15) + A13;
     288    pV[33] = -(pV[ 1] = A01 + A09 + A13 + A15) - A14;
     289    pV[35] = -(pV[ 3] = A05 + A07 + A09 + A13 + A15) - A06 - A14;
     290    pV[37] = (tmp = -(A10 + A11 + A13 + A14 + A15)) - A05 - A06 - A07;
     291    pV[39] = tmp - A02 - A03;                      // abhängig vom Befehl drüber
     292    pV[41] = (tmp += A13 - A12) - A02 - A03;       // abhängig vom Befehl 2 drüber
     293    pV[43] = tmp - A04 - A06 - A07;                // abhängig von Befehlen 1 und 3 drüber
     294    pV[47] = (tmp = -(A08 + A12 + A14 + A15)) - A00;
     295    pV[45] = tmp - A04 - A06 - A07;                // abhängig vom Befehl drüber
     296
     297    pV[32] = -pV[ 0];
     298    pV[31] = -pV[ 1];
     299    pV[30] = -pV[ 2];
     300    pV[29] = -pV[ 3];
     301    pV[28] = -pV[ 4];
     302    pV[27] = -pV[ 5];
     303    pV[26] = -pV[ 6];
     304    pV[25] = -pV[ 7];
     305    pV[24] = -pV[ 8];
     306    pV[23] = -pV[ 9];
     307    pV[22] = -pV[10];
     308    pV[21] = -pV[11];
     309    pV[20] = -pV[12];
     310    pV[19] = -pV[13];
     311    pV[18] = -pV[14];
     312    pV[17] = -pV[15];
     313
     314    pV[63] =  pV[33];
     315    pV[62] =  pV[34];
     316    pV[61] =  pV[35];
     317    pV[60] =  pV[36];
     318    pV[59] =  pV[37];
     319    pV[58] =  pV[38];
     320    pV[57] =  pV[39];
     321    pV[56] =  pV[40];
     322    pV[55] =  pV[41];
     323    pV[54] =  pV[42];
     324    pV[53] =  pV[43];
     325    pV[52] =  pV[44];
     326    pV[51] =  pV[45];
     327    pV[50] =  pV[46];
     328    pV[49] =  pV[47];
    329329}
    330330
    331 static void Synthese_Filter_float_internal(MPC_SAMPLE_FORMAT * OutData,MPC_SAMPLE_FORMAT * V,const MPC_SAMPLE_FORMAT * Y)
     331static void
     332mpc_synthese_filter_float_internal(MPC_SAMPLE_FORMAT* p_out, MPC_SAMPLE_FORMAT* pV, const MPC_SAMPLE_FORMAT* pY)
    332333{
    333334    mpc_uint32_t n;
    334     for ( n = 0; n < 36; n++, Y += 32 ) {
    335         V -= 64;
    336         Calculate_New_V ( Y, V );
     335    for ( n = 0; n < 36; n++, pY += 32 )
     336    {
     337        MPC_SAMPLE_FORMAT*       pData = p_out;
     338        const MPC_SAMPLE_FORMAT* pD    = (const MPC_SAMPLE_FORMAT*) &Di_opt;
     339        mpc_int32_t k;
     340        pV -= 64;
     341        mpc_compute_new_V( pY, pV );
     342        for ( k = 0; k < 32; k++, pD += 16, pV++ )
    337343        {
    338             MPC_SAMPLE_FORMAT * Data = OutData;
    339             const MPC_SAMPLE_FORMAT *  D = (const MPC_SAMPLE_FORMAT *) &Di_opt;
    340             mpc_int32_t           k;
    341             //mpc_int32_t           tmp;
    342 
    343            
    344            
    345             for ( k = 0; k < 32; k++, D += 16, V++ ) {
    346                 *Data = MPC_SHL(
    347                     MPC_MULTIPLY_FRACT(V[  0],D[ 0]) + MPC_MULTIPLY_FRACT(V[ 96],D[ 1]) + MPC_MULTIPLY_FRACT(V[128],D[ 2]) + MPC_MULTIPLY_FRACT(V[224],D[ 3])
    348                     + MPC_MULTIPLY_FRACT(V[256],D[ 4]) + MPC_MULTIPLY_FRACT(V[352],D[ 5]) + MPC_MULTIPLY_FRACT(V[384],D[ 6]) + MPC_MULTIPLY_FRACT(V[480],D[ 7])
    349                     + MPC_MULTIPLY_FRACT(V[512],D[ 8]) + MPC_MULTIPLY_FRACT(V[608],D[ 9]) + MPC_MULTIPLY_FRACT(V[640],D[10]) + MPC_MULTIPLY_FRACT(V[736],D[11])
    350                     + MPC_MULTIPLY_FRACT(V[768],D[12]) + MPC_MULTIPLY_FRACT(V[864],D[13]) + MPC_MULTIPLY_FRACT(V[896],D[14]) + MPC_MULTIPLY_FRACT(V[992],D[15])
    351                     , 2);
    352                
    353                 Data += 2;
    354             }
    355             V -= 32;//bleh
    356             OutData+=64;
     344            *pData = MPC_SHL(
     345                     MPC_MULTIPLY_FRACT(pV[  0], pD[ 0]) + MPC_MULTIPLY_FRACT(pV[ 96], pD[ 1]) + MPC_MULTIPLY_FRACT(pV[128], pD[ 2]) + MPC_MULTIPLY_FRACT(pV[224], pD[ 3])
     346                   + MPC_MULTIPLY_FRACT(pV[256], pD[ 4]) + MPC_MULTIPLY_FRACT(pV[352], pD[ 5]) + MPC_MULTIPLY_FRACT(pV[384], pD[ 6]) + MPC_MULTIPLY_FRACT(pV[480], pD[ 7])
     347                   + MPC_MULTIPLY_FRACT(pV[512], pD[ 8]) + MPC_MULTIPLY_FRACT(pV[608], pD[ 9]) + MPC_MULTIPLY_FRACT(pV[640], pD[10]) + MPC_MULTIPLY_FRACT(pV[736], pD[11])
     348                   + MPC_MULTIPLY_FRACT(pV[768], pD[12]) + MPC_MULTIPLY_FRACT(pV[864], pD[13]) + MPC_MULTIPLY_FRACT(pV[896], pD[14]) + MPC_MULTIPLY_FRACT(pV[992], pD[15])
     349                   , 2);
     350            pData += 2;
    357351        }
     352        pV    -= 32; //bleh
     353        p_out += 64;
    358354    }
    359355}
    360356
    361357void
    362 mpc_decoder_synthese_filter_float(mpc_decoder *d, MPC_SAMPLE_FORMAT* OutData)
     358mpc_decoder_synthese_filter_float(mpc_decoder* p_dec, MPC_SAMPLE_FORMAT* p_out)
    363359{
    364360    /********* left channel ********/
    365     memmove(d->V_L + MPC_V_MEM, d->V_L, 960 * sizeof(MPC_SAMPLE_FORMAT) );
    366 
    367     Synthese_Filter_float_internal(
    368         OutData,
    369         (MPC_SAMPLE_FORMAT *)(d->V_L + MPC_V_MEM),
    370         (MPC_SAMPLE_FORMAT *)(d->Y_L [0]));
     361    memmove(&p_dec->V_L[MPC_V_MEM], p_dec->V_L, 960 * sizeof *p_dec->V_L);
     362    mpc_synthese_filter_float_internal(p_out, &p_dec->V_L[MPC_V_MEM], p_dec->Y_L[0]);
    371363
    372364    /******** right channel ********/
    373     memmove(d->V_R + MPC_V_MEM, d->V_R, 960 * sizeof(MPC_SAMPLE_FORMAT) );
    374 
    375     Synthese_Filter_float_internal(
    376         OutData + 1,
    377         (MPC_SAMPLE_FORMAT *)(d->V_R + MPC_V_MEM),
    378         (MPC_SAMPLE_FORMAT *)(d->Y_R [0]));
     365    memmove(&p_dec->V_R[MPC_V_MEM], p_dec->V_R, 960 * sizeof *p_dec->V_R);
     366    mpc_synthese_filter_float_internal(p_out + 1, &p_dec->V_R[MPC_V_MEM], p_dec->Y_R[0]);
    379367}
    380368
     
    385373/*******************************************/
    386374
    387 static const unsigned char    Parity [256] = {  // parity
     375static const mpc_uint8_t Parity [256] = {  // parity
    388376    0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,
    389377    1,0,0,1,0,1,1,0,0,1,1,0,1,0,0,1,0,1,1,0,1,0,0,1,1,0,0,1,0,1,1,0,
     
    423411 */
    424412mpc_uint32_t
    425 mpc_random_int(mpc_decoder *d)
     413mpc_random_int(mpc_decoder* p_dec)
    426414{
    427415#if 1
    428416    mpc_uint32_t  t1, t2, t3, t4;
    429417
    430     t3   = t1 = d->__r1;   t4   = t2 = d->__r2; // Parity calculation is done via table lookup, this is also available
    431     t1  &= 0xF5;        t2 >>= 25;               // on CPUs without parity, can be implemented in C and avoid unpredictable
    432     t1   = Parity [t1]; t2  &= 0x63;             // jumps and slow rotate through the carry flag operations.
    433     t1 <<= 31;          t2   = Parity [t2];
    434 
    435     return (d->__r1 = (t3 >> 1) | t1 ) ^ (d->__r2 = (t4 + t4) | t2 );
     418    t3   = t1 = p_dec->__r1; t4   = t2 = p_dec->__r2; // Parity calculation is done via table lookup, this is also available
     419    t1  &= 0xF5;             t2 >>= 25;               // on CPUs without parity, can be implemented in C and avoid unpredictable
     420    t1   = Parity[t1];      t2  &= 0x63;             // jumps and slow rotate through the carry flag operations.
     421    t1 <<= 31;               t2   = Parity[t2];
     422
     423    return (p_dec->__r1 = (t3 >> 1) | t1 ) ^ (p_dec->__r2 = (t4 + t4) | t2 );
    436424#else
    437     return (d->__r1 = (d->__r1 >> 1) | ((mpc_uint32_t)Parity [d->__r1 & 0xF5] << 31) ) ^
    438         (d->__r2 = (d->__r2 << 1) |  (mpc_uint32_t)Parity [(d->__r2 >> 25) & 0x63] );
     425    return (p_dec->__r1 = (p_dec->__r1 >> 1) | ((mpc_uint32_t) Parity[ p_dec->__r1 & 0xF5] << 31))
     426         ^ (p_dec->__r2 = (p_dec->__r2 << 1) |  (mpc_uint32_t) Parity[(p_dec->__r2 >> 25) & 0x63]);
    439427#endif
    440428}
Note: See TracChangeset for help on using the changeset viewer.