timesoftfloat.c

来自「sun2,sun3,sparcstation2 emulator」· C语言 代码 · 共 2,016 行 · 第 1/5 页

C
2,016
字号

static void time_a_float64_z_float128( float128 function( float64 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            function( inputs_float64[ inputNum ] );
            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        function( inputs_float64[ inputNum ] );
        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

#endif

static void time_az_float64( float64 function( float64 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            function( inputs_float64[ inputNum ] );
            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        function( inputs_float64[ inputNum ] );
        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static void time_ab_float64_z_flag( flag function( float64, float64 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNumA, inputNumB;

    count = 0;
    inputNumA = 0;
    inputNumB = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            function(
                inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
            inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
            if ( inputNumA == 0 ) ++inputNumB;
            inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNumA = 0;
    inputNumB = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
            function(
                inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
        inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
        if ( inputNumA == 0 ) ++inputNumB;
        inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static void time_abz_float64( float64 function( float64, float64 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNumA, inputNumB;

    count = 0;
    inputNumA = 0;
    inputNumB = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            function(
                inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
            inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
            if ( inputNumA == 0 ) ++inputNumB;
            inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNumA = 0;
    inputNumB = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
            function(
                inputs_float64[ inputNumA ], inputs_float64[ inputNumB ] );
        inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );
        if ( inputNumA == 0 ) ++inputNumB;
        inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static const float64 inputs_float64_pos[ numInputs_float64 ] = {
    LIT64( 0x422FFFC008000000 ),
    LIT64( 0x37E0000480000000 ),
    LIT64( 0x73FD2546120B7935 ),
    LIT64( 0x3FF0000000000000 ),
    LIT64( 0x4E07F766F09588D6 ),
    LIT64( 0x0000000000000000 ),
    LIT64( 0x3FCE000400000000 ),
    LIT64( 0x0313B60F0032BED8 ),
    LIT64( 0x41EFFFFFC0002000 ),
    LIT64( 0x3FB3C75D224F2B0F ),
    LIT64( 0x7FD00000004000FF ),
    LIT64( 0x212FFF8000001FFF ),
    LIT64( 0x3EE0000000FE0000 ),
    LIT64( 0x0010000080000004 ),
    LIT64( 0x41CFFFFE00000020 ),
    LIT64( 0x40303FFFFFFFFFFD ),
    LIT64( 0x3FD000003FEFFFFF ),
    LIT64( 0x3FD0000010000000 ),
    LIT64( 0x37FC6B5C16CA55CF ),
    LIT64( 0x413EEB940B9D1301 ),
    LIT64( 0x47E00200001FFFFF ),
    LIT64( 0x47F00021FFFFFFFE ),
    LIT64( 0x3FFFFFFFF80000FF ),
    LIT64( 0x407FFFFFE00FFFFF ),
    LIT64( 0x001497A63740C5E8 ),
    LIT64( 0x44BFFFE0001FFFFF ),
    LIT64( 0x16FFDFFEFFFFFFFF ),
    LIT64( 0x403FC000000001FE ),
    LIT64( 0x7FD00000000001F6 ),
    LIT64( 0x0640400002000000 ),
    LIT64( 0x479CEE1E4F789FE0 ),
    LIT64( 0x4237FFFFFFFFFDFE )
};

static void time_az_float64_pos( float64 function( float64 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            function( inputs_float64_pos[ inputNum ] );
            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        function( inputs_float64_pos[ inputNum ] );
        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

#ifdef FLOATX80

enum {
    numInputs_floatx80 = 32
};

static const struct {
    bits16 high;
    bits64 low;
} inputs_floatx80[ numInputs_floatx80 ] = {
    { 0xC03F, LIT64( 0xA9BE15A19C1E8B62 ) },
    { 0x8000, LIT64( 0x0000000000000000 ) },
    { 0x75A8, LIT64( 0xE59591E4788957A5 ) },
    { 0xBFFF, LIT64( 0xFFF0000000000040 ) },
    { 0x0CD8, LIT64( 0xFC000000000007FE ) },
    { 0x43BA, LIT64( 0x99A4000000000000 ) },
    { 0x3FFF, LIT64( 0x8000000000000000 ) },
    { 0x4081, LIT64( 0x94FBF1BCEB5545F0 ) },
    { 0x403E, LIT64( 0xFFF0000000002000 ) },
    { 0x3FFE, LIT64( 0xC860E3C75D224F28 ) },
    { 0x407E, LIT64( 0xFC00000FFFFFFFFE ) },
    { 0x737A, LIT64( 0x800000007FFDFFFE ) },
    { 0x4044, LIT64( 0xFFFFFF80000FFFFF ) },
    { 0xBBFE, LIT64( 0x8000040000001FFE ) },
    { 0xC002, LIT64( 0xFF80000000000020 ) },
    { 0xDE8D, LIT64( 0xFFFFFFFFFFE00004 ) },
    { 0xC004, LIT64( 0x8000000000003FFB ) },
    { 0x407F, LIT64( 0x800000000003FFFE ) },
    { 0xC000, LIT64( 0xA459EE6A5C16CA55 ) },
    { 0x8003, LIT64( 0xC42CBF7399AEEB94 ) },
    { 0xBF7F, LIT64( 0xF800000000000006 ) },
    { 0xC07F, LIT64( 0xBF56BE8871F28FEA ) },
    { 0xC07E, LIT64( 0xFFFF77FFFFFFFFFE ) },
    { 0xADC9, LIT64( 0x8000000FFFFFFFDE ) },
    { 0xC001, LIT64( 0xEFF7FFFFFFFFFFFF ) },
    { 0x4001, LIT64( 0xBE84F30125C497A6 ) },
    { 0xC06B, LIT64( 0xEFFFFFFFFFFFFFFF ) },
    { 0x4080, LIT64( 0xFFFFFFFFBFFFFFFF ) },
    { 0x87E9, LIT64( 0x81FFFFFFFFFFFBFF ) },
    { 0xA63F, LIT64( 0x801FFFFFFEFFFFFE ) },
    { 0x403C, LIT64( 0x801FFFFFFFF7FFFF ) },
    { 0x4018, LIT64( 0x8000000000080003 ) }
};

static void time_a_floatx80_z_int32( int32 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            a.low = inputs_floatx80[ inputNum ].low;
            a.high = inputs_floatx80[ inputNum ].high;
            function( a );
            inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        a.low = inputs_floatx80[ inputNum ].low;
        a.high = inputs_floatx80[ inputNum ].high;
        function( a );
        inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static void time_a_floatx80_z_int64( int64 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            a.low = inputs_floatx80[ inputNum ].low;
            a.high = inputs_floatx80[ inputNum ].high;
            function( a );
            inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        a.low = inputs_floatx80[ inputNum ].low;
        a.high = inputs_floatx80[ inputNum ].high;
        function( a );
        inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static void time_a_floatx80_z_float32( float32 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            a.low = inputs_floatx80[ inputNum ].low;
            a.high = inputs_floatx80[ inputNum ].high;
            function( a );
            inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        a.low = inputs_floatx80[ inputNum ].low;
        a.high = inputs_floatx80[ inputNum ].high;
        function( a );
        inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

static void time_a_floatx80_z_float64( float64 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            a.low = inputs_floatx80[ inputNum ].low;
            a.high = inputs_floatx80[ inputNum ].high;
            function( a );
            inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        a.low = inputs_floatx80[ inputNum ].low;
        a.high = inputs_floatx80[ inputNum ].high;
        function( a );
        inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

#ifdef FLOAT128

static void time_a_floatx80_z_float128( float128 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

    count = 0;
    inputNum = 0;
    startClock = clock();
    do {
        for ( i = minIterations; i; --i ) {
            a.low = inputs_floatx80[ inputNum ].low;
            a.high = inputs_floatx80[ inputNum ].high;
            function( a );
            inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
        }
        count += minIterations;
    } while ( clock() - startClock < CLOCKS_PER_SEC );
    inputNum = 0;
    startClock = clock();
    for ( i = count; i; --i ) {
        a.low = inputs_floatx80[ inputNum ].low;
        a.high = inputs_floatx80[ inputNum ].high;
        function( a );
        inputNum = ( inputNum + 1 ) & ( numInputs_floatx80 - 1 );
    }
    endClock = clock();
    reportTime( count, endClock - startClock );

}

#endif

static void time_az_floatx80( floatx80 function( floatx80 ) )
{
    clock_t startClock, endClock;
    int32 count, i;
    int8 inputNum;
    floatx80 a;

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?