Commit 279bf335 authored by thomas dettbarn's avatar thomas dettbarn
Browse files

more defines for the safety shifts.

parent 7dcd8648
Loading
Loading
Loading
Loading
+24 −18
Original line number Diff line number Diff line
@@ -1004,13 +1004,15 @@ static void biDiagonalReductionLeft_64(
{

#define HEADROOM_LEFT_1 1
#define HEADROOM_LEFT_2 2
#define HEADROOM_LEFT_3 2
#define HEADROOM_LEFT_2 1
#define HEADROOM_LEFT_3 15
#define HEADROOM_LEFT_4 15

    Word16 iCh, jCh;
    Word32 norm_x;
    Word16 norm_x_e;
    Word64 norm_64;
	printf("\nF\n");
    ( *g ) = 0;
    ( *g_e ) = 0;
    move32();
@@ -1075,20 +1077,25 @@ 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_2 ) );
                factor2 = W_extract_l( W_shr( singularVectors_Left_64[jCh][iCh], HEADROOM_LEFT_2 ) );
                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 ) );
                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-HEADROOM_LEFT_3);	// works with headroom_left: 2,2,2
            magic_shift = norm_x_e-r_e+(28-HEADROOM_LEFT_3);	// works with headroom_left: 1,2,2
	printf("\nF:%08X norm_x_e:%3d r_e:%3d\n",f,norm_x_e,r_e);
//            magic_shift = norm_x_e - r_e + ( 28 - HEADROOM_LEFT_4 ); // works with headroom_left: 1,2,2 and 1,2,0
            magic_shift = norm_x_e - r_e + ( 32 -2*HEADROOM_LEFT_3 - HEADROOM_LEFT_4 ); // works with headroom_left: 1,2,2 and 1,2,0
//            magic_shift = norm_x_e - r_e + ( 30 - HEADROOM_LEFT_4 );
	printf("OUT:");
            FOR( jCh = currChannel; jCh < nChannelsL; jCh++ )
            {
                factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32-HEADROOM_LEFT_3 ) );
                factor1 = W_extract_h( W_shl( singularVectors_Left_64[jCh][currChannel], 32 - HEADROOM_LEFT_4 ) );
                singularVectors_Left_64[jCh][iCh] = W_add( singularVectors_Left_64[jCh][iCh], W_shr( W_mult0_32_32( f, factor1 ), magic_shift ) );
printf("%016llX ",singularVectors_Left_64[jCh][iCh]);
            }
	printf("\n");
        }
    }
}
@@ -1115,7 +1122,8 @@ static void biDiagonalReductionRight_64(

#define HEADROOM_RIGHT_1 2
#define HEADROOM_RIGHT_2 2
#define HEADROOM_RIGHT_3 2
#define HEADROOM_RIGHT_3 15
#define HEADROOM_RIGHT_4 15


    ( *g ) = 0;
@@ -1160,8 +1168,8 @@ static void biDiagonalReductionRight_64(
            }
            move32();
            move16();
            factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_1 ) );
            tmp_e = sub( HEADROOM_RIGHT_1, *g_e );
            factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][idx], HEADROOM_RIGHT_2 ) );
            tmp_e = sub( HEADROOM_RIGHT_2, *g_e );
            tmpmul = W_mult0_32_32( *g, factor2 );
            tmpmul = W_shr( tmpmul, tmp_e );
            r_64 = W_sub( tmpmul, norm_64 );
@@ -1182,24 +1190,22 @@ static void biDiagonalReductionRight_64(
                move64();
                FOR( jCh = idx; jCh < nChannelsC; jCh++ )
                {
                    factor1 = W_extract_l( W_shr( singularVectors_Left_64[iCh][jCh], HEADROOM_RIGHT_2 ) );
                    factor2 = W_extract_l( W_shr( singularVectors_Left_64[currChannel][jCh], HEADROOM_RIGHT_2 ) );
                    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 ) );
                    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   +29-(HEADROOM_RIGHT_3); // works with headroom_right: 2,2,2
printf("magic_shift:%3d norm_x_e:%3d r_e:%3d [",magic_shift,norm_x_e,r_e);
//                magic_shift = norm_x_e - r_e + 29 - ( HEADROOM_RIGHT_4 ); // works with headroom_right: 2,2,2
                magic_shift = norm_x_e - r_e + 33 -2*HEADROOM_RIGHT_3 - ( HEADROOM_RIGHT_4 ); // works with headroom_right: 2,2,2

                FOR( jCh = idx; jCh < nChannelsC; jCh++ )
                {
printf("%3d ",W_norm(singularVectors_Left_64[currChannel][jCh] ) );
                    factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32-HEADROOM_RIGHT_3 ) );
                    factor2 = W_extract_h( W_shl( singularVectors_Left_64[currChannel][jCh], 32 - HEADROOM_RIGHT_4 ) );
                    singularVectors_Left_64[iCh][jCh] = W_add( singularVectors_Left_64[iCh][jCh], W_shr( W_mult0_32_32( f, factor2 ), magic_shift ) );
                }
printf("]\n");
            }
        }
    }