timesoftfloat.c

来自「基于4个mips核的noc设计」· C语言 代码 · 共 1,051 行 · 第 1/3 页

C
1,051
字号
}enum {    numInputs_float64 = 32};static const struct {    bits32 high, low;} inputs_float64[ numInputs_float64 ] = {    { 0x422FFFC0, 0x08000000 },    { 0xB7E00004, 0x80000000 },    { 0xF3FD2546, 0x120B7935 },    { 0x3FF00000, 0x00000000 },    { 0xCE07F766, 0xF09588D6 },    { 0x80000000, 0x00000000 },    { 0x3FCE0004, 0x00000000 },    { 0x8313B60F, 0x0032BED8 },    { 0xC1EFFFFF, 0xC0002000 },    { 0x3FB3C75D, 0x224F2B0F },    { 0x7FD00000, 0x004000FF },    { 0xA12FFF80, 0x00001FFF },    { 0x3EE00000, 0x00FE0000 },    { 0x00100000, 0x80000004 },    { 0x41CFFFFE, 0x00000020 },    { 0x40303FFF, 0xFFFFFFFD },    { 0x3FD00000, 0x3FEFFFFF },    { 0xBFD00000, 0x10000000 },    { 0xB7FC6B5C, 0x16CA55CF },    { 0x413EEB94, 0x0B9D1301 },    { 0xC7E00200, 0x001FFFFF },    { 0x47F00021, 0xFFFFFFFE },    { 0xBFFFFFFF, 0xF80000FF },    { 0xC07FFFFF, 0xE00FFFFF },    { 0x001497A6, 0x3740C5E8 },    { 0xC4BFFFE0, 0x001FFFFF },    { 0x96FFDFFE, 0xFFFFFFFF },    { 0x403FC000, 0x000001FE },    { 0xFFD00000, 0x000001F6 },    { 0x06404000, 0x02000000 },    { 0x479CEE1E, 0x4F789FE0 },    { 0xC237FFFF, 0xFFFFFDFE }};static void time_a_float64_z_int32( int32 function( float64 ) ){    clock_t startClock, endClock;    int32 count, i;    int8 inputNum;    float64 a;    count = 0;    inputNum = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64[ inputNum ].low;            a.high = inputs_float64[ inputNum ].high;            function( a );            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );        }        count += minIterations;    } while ( clock() - startClock < CLOCKS_PER_SEC );    inputNum = 0;    startClock = clock();    for ( i = count; i; --i ) {        a.low = inputs_float64[ inputNum ].low;        a.high = inputs_float64[ inputNum ].high;        function( a );        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );    }    endClock = clock();    reportTime( count, endClock - startClock );}static void time_a_float64_z_float32( float32 function( float64 ) ){    clock_t startClock, endClock;    int32 count, i;    int8 inputNum;    float64 a;    count = 0;    inputNum = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64[ inputNum ].low;            a.high = inputs_float64[ inputNum ].high;            function( a );            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );        }        count += minIterations;    } while ( clock() - startClock < CLOCKS_PER_SEC );    inputNum = 0;    startClock = clock();    for ( i = count; i; --i ) {        a.low = inputs_float64[ inputNum ].low;        a.high = inputs_float64[ inputNum ].high;        function( a );        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );    }    endClock = clock();    reportTime( count, endClock - startClock );}static void time_az_float64( float64 function( float64 ) ){    clock_t startClock, endClock;    int32 count, i;    int8 inputNum;    float64 a;    count = 0;    inputNum = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64[ inputNum ].low;            a.high = inputs_float64[ inputNum ].high;            function( a );            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );        }        count += minIterations;    } while ( clock() - startClock < CLOCKS_PER_SEC );    inputNum = 0;    startClock = clock();    for ( i = count; i; --i ) {        a.low = inputs_float64[ inputNum ].low;        a.high = inputs_float64[ inputNum ].high;        function( a );        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;    float64 a, b;    count = 0;    inputNumA = 0;    inputNumB = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64[ inputNumA ].low;            a.high = inputs_float64[ inputNumA ].high;            b.low = inputs_float64[ inputNumB ].low;            b.high = inputs_float64[ inputNumB ].high;            function( a, b );            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 ) {        a.low = inputs_float64[ inputNumA ].low;        a.high = inputs_float64[ inputNumA ].high;        b.low = inputs_float64[ inputNumB ].low;        b.high = inputs_float64[ inputNumB ].high;        function( a, b );        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;    float64 a, b;    count = 0;    inputNumA = 0;    inputNumB = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64[ inputNumA ].low;            a.high = inputs_float64[ inputNumA ].high;            b.low = inputs_float64[ inputNumB ].low;            b.high = inputs_float64[ inputNumB ].high;            function( a, b );            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 ) {        a.low = inputs_float64[ inputNumA ].low;        a.high = inputs_float64[ inputNumA ].high;        b.low = inputs_float64[ inputNumB ].low;        b.high = inputs_float64[ inputNumB ].high;        function( a, b );        inputNumA = ( inputNumA + 1 ) & ( numInputs_float64 - 1 );        if ( inputNumA == 0 ) ++inputNumB;        inputNumB = ( inputNumB + 1 ) & ( numInputs_float64 - 1 );    }    endClock = clock();    reportTime( count, endClock - startClock );}static const struct {    bits32 high, low;} inputs_float64_pos[ numInputs_float64 ] = {    { 0x422FFFC0, 0x08000000 },    { 0x37E00004, 0x80000000 },    { 0x73FD2546, 0x120B7935 },    { 0x3FF00000, 0x00000000 },    { 0x4E07F766, 0xF09588D6 },    { 0x00000000, 0x00000000 },    { 0x3FCE0004, 0x00000000 },    { 0x0313B60F, 0x0032BED8 },    { 0x41EFFFFF, 0xC0002000 },    { 0x3FB3C75D, 0x224F2B0F },    { 0x7FD00000, 0x004000FF },    { 0x212FFF80, 0x00001FFF },    { 0x3EE00000, 0x00FE0000 },    { 0x00100000, 0x80000004 },    { 0x41CFFFFE, 0x00000020 },    { 0x40303FFF, 0xFFFFFFFD },    { 0x3FD00000, 0x3FEFFFFF },    { 0x3FD00000, 0x10000000 },    { 0x37FC6B5C, 0x16CA55CF },    { 0x413EEB94, 0x0B9D1301 },    { 0x47E00200, 0x001FFFFF },    { 0x47F00021, 0xFFFFFFFE },    { 0x3FFFFFFF, 0xF80000FF },    { 0x407FFFFF, 0xE00FFFFF },    { 0x001497A6, 0x3740C5E8 },    { 0x44BFFFE0, 0x001FFFFF },    { 0x16FFDFFE, 0xFFFFFFFF },    { 0x403FC000, 0x000001FE },    { 0x7FD00000, 0x000001F6 },    { 0x06404000, 0x02000000 },    { 0x479CEE1E, 0x4F789FE0 },    { 0x4237FFFF, 0xFFFFFDFE }};static void time_az_float64_pos( float64 function( float64 ) ){    clock_t startClock, endClock;    int32 count, i;    int8 inputNum;    float64 a;    count = 0;    inputNum = 0;    startClock = clock();    do {        for ( i = minIterations; i; --i ) {            a.low = inputs_float64_pos[ inputNum ].low;            a.high = inputs_float64_pos[ inputNum ].high;            function( a );            inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );        }        count += minIterations;    } while ( clock() - startClock < CLOCKS_PER_SEC );    inputNum = 0;    startClock = clock();    for ( i = count; i; --i ) {        a.low = inputs_float64_pos[ inputNum ].low;        a.high = inputs_float64_pos[ inputNum ].high;        function( a );        inputNum = ( inputNum + 1 ) & ( numInputs_float64 - 1 );    }    endClock = clock();    reportTime( count, endClock - startClock );}enum {    INT32_TO_FLOAT32 = 1,    INT32_TO_FLOAT64,    FLOAT32_TO_INT32,    FLOAT32_TO_INT32_ROUND_TO_ZERO,    FLOAT32_TO_FLOAT64,    FLOAT32_ROUND_TO_INT,    FLOAT32_ADD,    FLOAT32_SUB,    FLOAT32_MUL,    FLOAT32_DIV,    FLOAT32_REM,    FLOAT32_SQRT,    FLOAT32_EQ,    FLOAT32_LE,    FLOAT32_LT,    FLOAT32_EQ_SIGNALING,    FLOAT32_LE_QUIET,    FLOAT32_LT_QUIET,    FLOAT64_TO_INT32,    FLOAT64_TO_INT32_ROUND_TO_ZERO,    FLOAT64_TO_FLOAT32,    FLOAT64_ROUND_TO_INT,    FLOAT64_ADD,    FLOAT64_SUB,    FLOAT64_MUL,    FLOAT64_DIV,    FLOAT64_REM,    FLOAT64_SQRT,    FLOAT64_EQ,    FLOAT64_LE,    FLOAT64_LT,    FLOAT64_EQ_SIGNALING,    FLOAT64_LE_QUIET,    FLOAT64_LT_QUIET,    NUM_FUNCTIONS};static struct {    char *name;    int8 numInputs;    flag roundingMode, tininessMode;} functions[ NUM_FUNCTIONS ] = {    { 0, 0, 0, 0 },    { "int32_to_float32",                1, TRUE,  FALSE },    { "int32_to_float64",                1, FALSE, FALSE },    { "float32_to_int32",                1, TRUE,  FALSE },    { "float32_to_int32_round_to_zero",  1, FALSE, FALSE },    { "float32_to_float64",              1, FALSE, FALSE },    { "float32_round_to_int",            1, TRUE,  FALSE },    { "float32_add",                     2, TRUE,  FALSE },    { "float32_sub",                     2, TRUE,  FALSE },    { "float32_mul",                     2, TRUE,  TRUE, },    { "float32_div",                     2, TRUE,  FALSE },    { "float32_rem",                     2, FALSE, FALSE },    { "float32_sqrt",                    1, TRUE,  FALSE },    { "float32_eq",                      2, FALSE, FALSE },    { "float32_le",                      2, FALSE, FALSE },    { "float32_lt",                      2, FALSE, FALSE },

⌨️ 快捷键说明

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