Commit a18e470a authored by thomas dettbarn's avatar thomas dettbarn
Browse files

the magic shift has gotten more deterministic.

parent 0387efd8
Loading
Loading
Loading
Loading
+17 −14
Original line number Diff line number Diff line
@@ -1004,13 +1004,14 @@ static void biDiagonalReductionLeft_64(
{

#define HEADROOM_LEFT_1 2
#define HEADROOM_LEFT_2 10
#define HEADROOM_LEFT_3 15
#define HEADROOM_LEFT_4 15
#define HEADROOM_LEFT_2 ( 16 - norm_x_e0 / 4 ) // 12
#define HEADROOM_LEFT_3 ( 16 - norm_x_e0 / 4 ) // 14
#define HEADROOM_LEFT_4 ( 16 - norm_x_e0 / 4 ) // 15

    Word16 iCh, jCh;
    Word32 norm_x;
    Word16 norm_x_e;
    Word16 norm_x_e0;
    Word64 norm_64;
    ( *g ) = 0;
    ( *g_e ) = 0;
@@ -1030,6 +1031,7 @@ static void biDiagonalReductionLeft_64(
            norm_64 = W_add( norm_64, W_mult0_32_32( tmp, tmp ) );
        }
        norm_x_e = W_norm( norm_64 );
        norm_x_e0 = W_norm( norm_64 );
        norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) );
    }
    IF( norm_x )
@@ -1076,15 +1078,14 @@ static void biDiagonalReductionLeft_64(
            norm_64 = 0;
            for ( jCh = currChannel; jCh < nChannelsL; jCh++ )
            {
                factor1 = W_extract_l( W_shr( singularVectors_Left_64[jCh][currChannel], HEADROOM_LEFT_3 ) );
                factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_3 ) );
                factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_3 ) );
                factor2 = W_extract_h( W_shl( singularVectors_Left_64[jCh][iCh], 32 - HEADROOM_LEFT_3 ) );
                norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) );
            }
            norm_x_e = W_norm( norm_64 );
            norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) );
            f = Mpy_32_32( norm_x, invVal );
//            magic_shift = norm_x_e - r_e + ( 32 + HEADROOM_LEFT_1 - 2 * HEADROOM_LEFT_3 - HEADROOM_LEFT_4 );
            magic_shift = norm_x_e - r_e + ( 30 + 2 * HEADROOM_LEFT_1 - 2 * HEADROOM_LEFT_3 - HEADROOM_LEFT_4 );
            magic_shift = ( norm_x_e - 2 * HEADROOM_LEFT_3 ) - ( r_e - 2 * HEADROOM_LEFT_1 ) + ( 32 - HEADROOM_LEFT_4 ) - 2;
            FOR( jCh = currChannel; jCh < nChannelsL; jCh++ )
            {
                factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_4 ) );
@@ -1111,13 +1112,14 @@ static void biDiagonalReductionRight_64(
    Word16 iCh, jCh;
    Word32 norm_x;
    Word16 norm_x_e;
    Word16 norm_x_e0;
    Word64 norm_64;
    Word16 idx;

#define HEADROOM_RIGHT_1 2
#define HEADROOM_RIGHT_2 10
#define HEADROOM_RIGHT_3 15
#define HEADROOM_RIGHT_4 15
#define HEADROOM_RIGHT_2 ( 16 - norm_x_e0 / 4 ) // 12
#define HEADROOM_RIGHT_3 ( 16 - norm_x_e0 / 4 ) // 14
#define HEADROOM_RIGHT_4 ( 16 - norm_x_e0 / 4 ) // 15


    ( *g ) = 0;
@@ -1136,6 +1138,7 @@ static void biDiagonalReductionRight_64(
            norm_64 = W_add( norm_64, W_mult0_32_32( tmp, tmp ) );
        }
        norm_x_e = W_norm( norm_64 );
        norm_x_e0 = W_norm( norm_64 );
        norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) );
        move16();

@@ -1184,15 +1187,15 @@ static void biDiagonalReductionRight_64(
                move64();
                FOR( jCh = idx; jCh < nChannelsC; jCh++ )
                {
                    factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_3 ) );
                    factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_3 ) );
                    factor1 = W_extract_h( W_shl( singularVectors_Left_64[iCh][jCh], 32 - HEADROOM_RIGHT_3 ) );
                    factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_3 ) );
                    norm_64 = W_add( norm_64, W_mult0_32_32( factor1, factor2 ) );
                }

                norm_x_e = W_norm( norm_64 );
                norm_x = W_extract_h( W_shl( norm_64, norm_x_e ) );
                f = Mpy_32_32( norm_x, invVal );
                magic_shift = norm_x_e - r_e + ( 30 + 2 * HEADROOM_RIGHT_1 - 2 * HEADROOM_RIGHT_3 - HEADROOM_RIGHT_4 );
                magic_shift = ( norm_x_e - 2 * HEADROOM_RIGHT_3 ) - ( r_e - 2 * HEADROOM_RIGHT_1 ) + ( 32 - HEADROOM_RIGHT_4 ) - 2;

                FOR( jCh = idx; jCh < nChannelsC; jCh++ )
                {